2009-04-27 3 views
17

저는 C#에 익숙하지 않습니다.이 순간 모든 public 변수를 만드는 데 사용했습니다. 모든 메서드는 public static이므로 다른 클래스에서 액세스 할 수 있습니다.공개/비공개/정적 방법은 언제 사용해야합니까?

내가 가진 정적 정적 방법이 적다는 것을 읽었습니다. 그래서 모든 코드를 하나의 클래스에 넣음으로써 어플리케이션을 다시 작성했습니다. 폼 클래스입니다. 이제 모든 메소드는 private이고 static 메소드는 없습니다.

내 질문 : 어떻게해야합니까, 내 의견으로는 폼 클래스의 모든 것을 보관하십시오.

언제 공개해야합니까?

공용 메서드를 디 컴파일 할 수 있기 때문에 공용 메서드를 가져 오지만 의심 스럽습니다. 내 공용 메서드도 디 컴파일 할 수 있습니다. 개인 메서드에서는 무엇이 "개인"입니까?

EDIT : 내 프로그램이 디 컴파일되지 않도록하는 방법을 묻지 않고 정적, 개인 및 공개를 사용해야하는지 묻습니다. 또한 : 코드를 모든 코드에 적용하는 데 문제가 있습니까? 양식 클래스 그래서 공용 메서드를 사용해야합니까?

+0

귀하의 질문의 중복처럼 보인다 : [http://stackoverflow.com/questions/99688/private -vs-public-members-in-practice- 어떻게 캡슐화가 중요 할까?] (http://stackoverflow.com/questions/99688/private-vs-public-members-in-practice-how-important-is- 캡슐화) –

답변

8

개인은 신체의 클래스 내에서만 액세스하려는 클래스 회원이며, 개인 사용하는 경우의

예 다른 지정하지 않는 한 C에서 # 회원은 개인에 대한 기본 설정을 다음과 같습니다

class Account 
{ 

    private int pin = 1090; 
    public int Pin 
    { 
    get { return pin; } 
    } 
} 
을 반면에

공개는 반대입니다. 공개 회원에게 액세스하는 데 제한이 없으므로 액세스 권한이있는 사용자와 관련이없는 것이 공개되어야합니다.

static은 다른 한편으로는 정적이 아니라 메서드에 대한 사용 권한을 다루지 않기 때문에 두 가지와 아무런 관련이 없습니다. 반면 정적은 상수 또는 형식 선언입니다. 정적이라는 단어가 클래스에 적용되면 클래스의 모든 멤버는 정적으로 선언되어야합니다.정적 사용하는 경우의

예 :

static int birth_year= 1985 

Modifiers in C# Reference 당신에게 모든 C#에서 수정하고 달리 입증하지 않는 한 개인이어야한다

4

Access Modifiers (C# Programming Guide)을 참조하십시오. 그러나 C#과 OOP/OOD에 대한 책을 잘 읽으면 훨씬 더 좋습니다. 이것은 컴퓨터 과학의 기초입니다.

짧은 설명 : 액세스 한정자는 캡슐화를 촉진합니다. 기본적으로 모든 클래스가 자체적으로 비공개를 유지해야 함을 의미합니다.

3

저는 객체 지향 프로그래밍에 대한 기초를 배우기 시작할 것입니다. 거기에 많은 자원이 있습니다. 아마도 가장 좋은 것은 코스를 시작하는 것입니다. 당신은 OO 원칙을 이해하는 것에서 멀리 떨어져있는 것처럼 보입니다.

+0

"C#을 처음 사용한다고 말했을 때"나는 내가 초보자 인 것을 의미하지는 않았습니다. 저는 몇 년 전에 파스칼 애호가였습니다. C#을 처음 접했을뿐입니다. –

+7

정말 조언 일뿐입니다. 나는 불쾌하거나 당신이 좋은 프로그래머가 아니라고 말하고 싶지 않았습니다. 그러나 당신이 "모든 것을 정적으로"하고 "모든 것을 하나의 클래스에 넣어서 개인화"한다고 말하면, 당신이 객체 지향 프로그래밍에 익숙하지 않은 것처럼 들립니다. –

0

위의 질문보다 기본적인 것 같습니다. OO 언어로 제대로 번영하려면 최종 목표를 일련의 목표를 달성하기 위해 함께 작동하는 일련의 객체 (서로 포함하고 확장하는 경우조차도)로 분해하는 방법을 찾아야합니다. 이 추상화는 객체 지향 디자인을 올바르게 구현하기 시작하면 명백 해지는 다양한 이점을 제공합니다. 언급 한 바와 같이, 새로운 C# 서적을 원할 것입니다. 만약 당신이 이미 O bject O의 프로그래밍을 중점적으로 설명하는 부분에 익숙하지 않았다면 말입니다.

12

모두를 사용하는 방법의 예 자세한 내용을 제공 할 것입니다. 공개와 비공개의 차이는 호환성을 유지해야하는 것과 호환되지 않아야하는 것, 세계에서 흥미로울 것으로 예상되는 것과 비즈니스가 아닌 것으로 간주되는 것 사이입니다.

public으로 선언하면 클래스 (결과적으로 객체)가 강력한 선언문을 작성합니다.이 인터페이스는 내 눈에 보이는 인터페이스이며 다른 많은 것들이 있습니다.하지만 이것은 내 것입니다. 공용 인터페이스는 클래스가 수행 할 수있는 작업에 대해 다른 국가 (어떤 의미이든)로 내보내는 계약상의 동의입니다. 공용 인터페이스를 수정하면 나머지 세계에서 해당 클래스에 대한 계약을 위반할 위험이 있습니다.

반면에 사적인 내용은 클래스 내부에 있습니다. 클래스가 객체 상태 (메소드 일 경우)를 전달하거나 내부 상태 (변수 인 경우)를 유지하면서 클래스가 작업을 수행하는 데 사용해야하는 기능을 지원합니다. 인터페이스 계약을 위반하지 않고 원하는대로 클래스 비공개 항목을 해킹하고 조정할 수 있습니다. 이는 리팩토링 (예 : 효율성 향상을위한 내부 데이터 표현)을 자유롭게 선택할 수 있음을 의미합니다. 비공개 항목은 인터페이스의 일부가 아닙니다.

보호는 다시 구현하기위한 개방성과 관련이 있습니다. 가능하다면, 깊이 중첩 된 상속을 피하십시오. 재 구현 클래스가 기본 클래스를 망칠 수 있으므로 처리하기가 매우 어렵습니다.

기술적으로 클래스는 인터페이스 (public)와 구현 (private)을 선언해야합니다. 인터페이스는 코드를 전혀 가져서는 안되며, private "구현"로직을 위임해야합니다. 이것이 Java와 C#에서 C++의 순수 추상 클래스 개념을 형식화하는 인터페이스 문을 사용하는 이유입니다.

정적은 클래스의 영역에 논리적으로 존재하지만 클래스 자체의 상태에 의존하지 않습니다. 디자인 패턴이 지시 할 때 (예 : 싱글 톤, 팩토리 메소드) 사용하지 말아야합니다.

4

위의 내용은 모두 이미 위에 설명했으나 조금 단순화 될 수 있다고 생각합니다. 다른 클래스가이 메서드를 사용한다면 public 메서드를 꾸미십시오. 그렇지 않은 경우 비공개로 표시합니다.

예를 들어 클래스 A클래스 B입니다. 클래스 A에는 3 가지 방법 (x, y, z)이 있습니다. 방법 X는클래스 B 의해 사용되므로 공공들을 표시하지만 방법 Z급 내부 방법 X 의해 사용될 것이다한다 Y 그렇게 필요로도 없다 그것은 전용으로 표시 이 방법을 외부 세계에 노출시킨다. 이 메서드 내부의 논리는 내부 용으로 만 사용됩니다.

정적이라는 것은이 장식이 달라지면 정적으로 표시된 개체의 인스턴스를 만들 수 없음을 의미합니다. 객체는 - 키워드가 말한대로 정적 (변경 또는 수정할 수 없음)입니다.

0

Java는 클래스, 변수, 메소드 및 생성자에 대한 액세스 레벨을 설정하는 많은 액세스 수정자를 제공합니다. 네 가지 액세스 수준은 다음과 같습니다.

패키지에 표시 기본값입니다. 한정자가 필요하지 않습니다.

수업에만 공개 (비공개).

세계에 공개 (공개).

패키지 및 모든 하위 클래스 (protected)에 표시됩니다. 여기

은 예입니다

공용 클래스 자전거 {

private int cadence; 
private int gear; 
private int speed; 
private int id; 
private static int numberOfBicycles = 0; 

public Bicycle(int startCadence, int startSpeed, int startGear){ 
    gear = startGear; 
    cadence = startCadence; 
    speed = startSpeed; 

    id = ++numberOfBicycles; 
} 

// new method to return the ID instance variable 
public int getID() { 
    return id; 
} 
    ... 

}

관련 문제