2013-02-27 3 views
3

중첩 클래스에 대해 C#에서 공부하려고합니다. 많은 문서를 읽고 고글을 읽은 후에도 중첩 클래스를 사용해야하는 시점에 대해서는 아직 명확하지 않습니다. 그러나 내가 이해하는 한, 나는 작은 샘플 프로그램을 만들었다. 아래 코드를 붙여 넣습니다. 이 중첩 된 클래스 프로그램이 올바른 논리로 구현 되었습니까? . 실제로 중첩 된 클래스는 무엇을 사용합니까? 또한이 프로그램에 의심의 여지가 생겼으며 그 프로그램에 의심을 나타 냈습니다. 제발 도와주세요 ...C#의 중첩 클래스

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     Bank bankObj = new Bank(); 
     bankObj.CreateAccount(); 
     bankObj.ShowMyAccountNumber(); 
    } 
} 

class Bank 
{ 
    static int accountNumber; // here if I just declare this as int accountNumber without static it showing an error in the CreatePersonalAccount(int accNo) method's first line ie accountNumber = accNo; as "Cannot access a non-static member of outer type." What actually this error mean ? 

    public class BankAccountSection 
    { 
     public bool CreatePersonalAccount(int accNo) 
     { 
      accountNumber = accNo; 
      return true; 
     } 
    } 

    public void CreateAccount() 
    { 
     bool result = new BankAccountSection().CreatePersonalAccount(10001); 
    } 

    public void ShowMyAccountNumber() 
    { 
     MessageBox.Show(accountNumber.ToString()); 
    } 
} 
+0

코드에 중첩 클래스가 전혀 표시되지 않습니다. 두 개의 분리 된 최상위 클래스가 있습니다. –

+4

@Jon,'BankAccountSection'은'Bank' 안에 중첩되어 있습니다. –

+1

Imo/ime 중첩 클래스에 많이 쓰이지 않습니다. –

답변

7

중첩 클래스는 일반적으로 (외부) 클래스 외부에서 사용하지 않는 작은 유틸리티 클래스에 사용됩니다. 따라서 중첩 클래스는 일반적으로 private입니다. (심지어에 대한 FxCop rule을 있어요.)

에 코드를 귀하의 경우에는

그 자체로 어떤 상태가 없기 때문에, 중첩 된 클래스 BankAccountSection 정말 유용하지 않습니다. CreatePersonalAccount도 외부 클래스의 메소드 일 수 있습니다.

관련하여 accountNumber은 (는) 에 걸쳐 모든 필드를 공유합니다. 전체 목적을 뛰어 넘는 은행 객체입니다. 그러지 마. 내부 클래스 내부에 Bank 객체의 필드를 설정해야한다면 Bank 객체의 참조를 내부 클래스에 전달해야합니다. (Java와는 다르다. 특정 상황에서 이러한 참조가 자동으로 사용 가능하다.) 특별한 경우에는 내부 클래스를 제거하면된다. 합법적 인 사용 사례

  • 에 대한

    예를 들면 당신은 방법 내부 큰 알고리즘을 가지고있다. 많은 작은 메소드와 인스턴스 변수를 사용하여이 알고리즘을 자체 클래스로 추출하면 가독성이 높아진다는 것을 알고 있습니다. 알고리즘은 매우 특정 적이기 때문에 다른 클래스에 유용하지는 않으므로 알고리즘을 내부 클래스에 넣습니다. 따라서, 당신은 그 알고리즘에 의해서만 사용되는 인스턴스 변수로 외부 클래스를 어수선하게 만들지 않습니다.

  • 내부적으로 linked list으로 구현 된 목록 데이터 구조를 만듭니다.목록 노드를 바깥 세계에 노출시키지 않으므로 노드를 내부 클래스로 만듭니다.

관련 : 당신은 그것의 목적없이 비 정적 클래스의 멤버에 액세스 할 수 없기 때문에

+0

'Thing'이 인스턴스가 특정 인스턴스에 대해 작동하는 유형을 정의하는 경우 형식이 'Thing.Frobber'인 경우 'ThingFrobber'보다 훨씬 명확하게 관계를 전달한다고 제안합니다. 이는 제네릭과 관련된 많은 상황에서 특히 그렇습니다. 'List .Enumerator'는 ListEnumerator '보다 명확합니다. 또한, 어댑터와 같은 것들을 포함하는 몇몇 경우에,'Name1 .Name2 '은'Name 보다 더 명확하게 타입들 간의 관계를 표현할 수 있습니다. – supercat

+0

일부 매개 변수는 지정하지만 다른 매개 변수는 지정하지 않는 방식으로 제네릭 메소드를 호출하려면 정적 클래스'ClassName '에 메소드 MethodName (U param)이 포함되어 있습니다. 메소드의 제네릭 타입 전부는 아니지만 일부의 스펙을 허용하는 더 좋은 방법은 없다는 것을 알고 있습니다. – supercat

0

C#의 중첩 클래스는 Java에서 어떻게 작동하는지 생각하는 것 같습니다. 즉, 중첩 된 클래스가 정적으로 선언되지 않으면 해당 클래스를 둘러싼 클래스의 인스턴스를 공유하게됩니다. C#에서는 그렇지 않습니다. C#에는 그런 종류의 일이 없습니다. 모든 중첩 된 클래스는 암시 적으로 정적입니다.

따라서 필드가 정적으로 선언되지 않는 한 중첩 된 클래스에서 accountNumber에 액세스 할 수 없습니다. (중첩 된 클래스는 특정 인스턴스에 액세스 할 수 없기 때문에) C#에서이 문제에 대한 유토피아 솔루션은 포함하는 클래스의 인스턴스를 중첩 클래스에 전달하는 것입니다 (인스턴스 생성시 생성자 인수를 통해 this 전달).

+0

'BankAccountSection'은 절대적으로 정적이라고 말합니까? 즉 정적 멤버 만있을 수 있습니까? 'CreatePersonalAccount'는 주어진 예제에서'static'으로 선언되지 않습니다. –

+0

아니요, "인스턴스 클래스"(C#에는 아날로그가 없지만 * Java에 존재합니다)라고 말하고 있습니다 –

0

먼저 중첩 클래스가 아니며 한 파일에 두 클래스입니다.

이제는 중첩 된 클래스 였지만 중첩 된 클래스를 사용하지 않는 경우의 예가 될 것입니다. 당신은 확실히 당신의 로직을 당신의 GUI 로직과 분리시켜야합니다.

어쨌든 중첩 된 클래스를 사용해야한다고 나는 생각하지 않습니다. 제 의견으로는 열심히 노력하지만, 틀릴 수도 있습니다. 실제로 중첩 된 클래스를 사용해야하는 경우 하위 클래스가 밀접하게 관련된 경우에만 그렇게 할 것입니다.

+3

OP는 중첩 클래스를 보여 줬습니다. –

0

오류입니다. 그렇다면 정적으로 선언해야합니다.