2014-09-12 3 views
0

C#의 새로운 기능 - 하위 클래스를 만들어 기본 클래스의 변형을 수행하도록 지시 받았습니다. 전에 하위 클래스를 작성한 적이 없으므로 조금 읽은 다음 시도해 보았습니다. 하위 클래스에서 기본 클래스를 상속 한 후에 만 ​​MyClass의 개인 속성에 액세스 할 수있었습니다. 내가 여기서 뭘 했니? 이것은 진정한 하위 클래스 또는 중첩 된 상속 클래스일까요?C# 하위 클래스 또는 인터페이스?

public class MyClass 
{ 
    private string connString; 
    // exec stored procedure 1 

    public class MySubClass : MyClass 
    { 
      otherClass o = new otherClass(connString); 
      // exec stored procedure 2 
    } 
} 

내가 한 것은 무엇이든 작동하는 것 같습니다. 또한 하위 클래스의 주제에 대해 이름을 지정하는 일반적인 방법이 있습니까? 예 : MyClass_SubClass 또는 _MyClass 등?

감사합니다.

편집 : 다시 한 번 감사드립니다. 나는이 대답을 찾고 있다고 생각한다. here. 그럼에도 불구하고 나는 중첩이나 상속을 전혀 할 필요가 없다는 것을 깨닫게되었습니다. 별도의 유사한 클래스를 만들었습니다.

+0

나는 당신의 질문을 정말로 이해하지 못한다. 그러나 당신이 * outer * 클래스의 private 필드에 접근 할 수있는 이유는 당신이 액세스를하고있는 내부 클래스를 둘러싸고 있기 때문이다. 서브 클래 싱과 관련이 없습니다. –

+0

기본 클래스에서 상속 할 때만 개인 필드에 액세스 할 수있었습니다. 혼란 스러웠습니다. 'protected'로 변경하면 중첩 된 클래스를베이스 외부로 옮기고 여전히 필드에 액세스 할 수 있습니다. – Shwarz

답변

5

당신은 중첩 된 클래스를 가지고 있습니다. 이것은 C#과 OOP을 더 잘 이해할 때까지 피하는 것이 좋습니다. (그리고 나서 당신은 이상한 것입니다.)

또는 그 파생어를 서브 클래 싱하는 것은 상속을 통해 수행됩니다. 당신의 예에서 :

public class MyClass 
{ 
    private string connString; 
    // exec stored procedure 1 
} 

public class MySubClass : MyClass 
{ 
     otherClass o = new otherClass(connString); 
     // exec stored procedure 2 
} 

MySubClassMyClass의 멤버에 액세스 할 수 있도록하려면, 해당 멤버는 protected 이상으로 표시해야합니다. private 멤버는 포함 된 클래스 외부에서 액세스 할 수 없습니다.

public class MyClass 
{ 
    protected string connString; 
    // exec stored procedure 1 
} 
+0

@KirkWoll 하나의 유효한 유스 케이스가 없다는 것을 말하는 것이 아니라 초보자로서 정상적인 상속을 사용해야하며 사용할 때 적절한 때를 이해할 수있을 때 중첩 된 클래스를 사용해야합니다. 나는 개인적으로 중첩 된 클래스를 코드 - 냄새로 보지만, 그건 내 의견이다. – BradleyDotNET

1

MySubClass는 실제로 MyClass.MySubClass입니다. 일반적으로 일반 하위 클래스는 전용 멤버에 액세스 할 수 없습니다.

일반 하위 클래스는 독립 실행 형 클래스와 별도의 파일에 있습니다. 하위 클래스가 기본 클래스 멤버에 대한 액세스가 허용되는 경우 "private"가 아닌 "protected"로 선언합니다.

이름 지정 주제가 하나 있는데, 일반적으로 이름은 기본 클래스에 관계없이 유형을 나타냅니다. 예를 들어, 기본 클래스가 Animal 인 경우 Dog 및 Cat이라는 하위 클래스가있는 것이 합리적입니다. 또는 Windows에서는 Control이라는 하위 클래스와 Button, TextBox, Label 등의 하위 클래스를 가질 수 있습니다.

1

코드가 유효합니다. 구현하라는 지시를 정확히 구현하지 않았습니다. 클래스 내에서 클래스를 선언 할 수 있습니다. 코드를 사용하면 다음과 같이 두 클래스를 모두 인스턴스화 할 수 있습니다.

이 꽤 이례적인 일이다
class Program 
{ 
    static void Main(string[] args) 
    { 
     MyClass myClass = new MyClass(); 
     MyClass.MySubClass mySubClass = new MyClass.MySubClass(); 
    } 
} 

, 그것은 클래스 내에서 선언 된 클래스를 가지고 드문 일이 아니지만 일반적으로 public으로 MySubClass를 선언 할 것이다, 당신은 개인 또는 보호로 선언합니다. 그렇게 ....

public class MyClass 
{ 
    private string connString; 
    private MyClassHelper mySubClass = new MyClassHelper(); 

    // exec stored procedure 1 

    protected class MyClassHelper 
    { 
     object o = new object(); 
     // exec stored procedure 2 
    } 
} 

... 그래서 MyClassHelper는 MyClass의 범위 내에 만 존재합니다. 내부 클래스가 외부 클래스를 상속하는 코드는 본 적이 없으며 완벽하게 컴파일되므로 절대 수행하지 않을 것입니다. 순환 참조를 쉽게 만들 수 있습니다.

BradleyDotNET의 대답은 MyClass의 하위 클래스를 구현하는 방법을 알려줍니다. 이것은 상속이라고도하며 여기에 대한 자세한 내용을 읽어보십시오 ...http://msdn.microsoft.com/en-us/library/ms173149(v=vs.80).aspx

경고의 한마디로 나는 계급 간의 상속 관계에 너무 열중하지 않을 것이고, 계급 간의 많은 종류의 관계가 있습니다 (class inheritance is quite restrictive).

질문의 제목은 하위 클래스 또는 인터페이스입니다. Interfaces은 사용자가보고 이해해야하는 것으로 특히 SOLID 코드를 구현하는 데 매우 중요합니다. 내 코드 클래스에서는 클래스를 상속하는 것보다 훨씬 더 일반적으로 인터페이스를 상속합니다.

+0

이것은 정말 좋은 설명입니다. – BradleyDotNET

+0

@ BradleyDotNET Brad 감사합니다 :) – Mick

관련 문제