할 수 없는 이유 클래스를 확장하는 그것의 자신의 중첩된 클래스에서는 C#?

StackOverflow https://stackoverflow.com/questions/265585

  •  06-07-2019
  •  | 
  •  

문제

예를 들어:

public class A : A.B
{
    public class B { }
}

를 생성하는 이 오류가 컴파일러:

원형 베이스 클래스 종속성 을 포함하는'한'과'A.B

나는 항상 중첩된 클래스에 행동하는 다음과 같은 클래스를 제외하고 특별한 규칙에 관한 액세스 외부 클래스의 전 멤버,하지만 난 어떤 암시적 상속 발생하는 사이 두 개의 클래스가?

도움이 되었습니까?

해결책

이 없다는 암시적 상속 관련된 지금까지 내가 말할 수 있습니다.나는 것이 될 것으로 예상된다 괜찮아요 하지만 내가 상상할 수 있는 기괴하는 경우 와 B 의 일반적입니다.

그것은에서 지정된 섹션 10.1.4 의 사양:

클래스 B 클래스에서 파생되는, 그것은 컴파일시 오류가 발생을 에 따라 달라집 B.클래스에 직접 따라 달라집 에 그것의 직접적인 기본 클래스(는 경우)및 직접에 따라 내에 있는 클래스 는 즉시 중첩 (는 경우 어떤).이렇게 정의 완전한 설정의 클래스에 따라 클래스에 따라 달라집은 전이 의 폐쇄에 직접에 따라 달라집 관계입니다.

나는 강조 표시된 관련 섹션입니다.

이유를 설명하는 컴파일러입니다 그것을 거절하지만,왜 언어를 금지하고 있습니다.내가 궁금해 있는 경우 CLI 제한...

편집:좋아,난에서 응답 에릭 프라하.기본적으로,그것은 것으로 기술적으로 가능한(이에 CLI 을 금지),그러나:

  • 그것이 허용하는 어려울 것에 컴파일러,무효화하는 다양한 현재 가정의 주위에 주문하고 주기
  • 그것은 매우 이상한 디자인 결정을 내는 것이 더 쉽을 금지하는 것보다 지원

그것은 또한 주목 이메일에 쓰레드는 것은 이런 종류의 유효합니다.

A.B x = new A.B.B.B.B.B.B.B.B.B.B.B.B();

...그러나는 것이 이미(에 의해 언급했듯이 Tinister)유효한 경우 B 에서 파생된 A.

중첩+상속=oddness...

다른 팁

이것은 C#것만큼 그것은 컴파일러는 것입니다.하나의 작업의 컴파일러를 레이아웃에 있는 클래스 메모리는 것은 무리의 기본적인 데이터 유형,포인터,함수 포인터와는 다른 클래스입니다.

할 수 없을 구성하는 레이아웃을 위한 클래스에까지 그것을 알고 레이아웃의 클래스 B 입니다.그것은 알 수 없습니다 무엇의 레이아웃 클래스 B 완료하기 전까지의 레이아웃 등 A.원형을 의미할 수 있습니다.

나는 생각 중첩은 의미를 나타내는 유형이 중첩 의 정의 의 중첩 유형입니다.와 함께하는 해석,제한 의미하기 때문에 시간에 컴파일러 명중의 정의,A.B 되지 않은 아직 정의,심지어의 끝에서,그것은 이미 정의된 측면에서 A.B.

에 대한 질문에 대해 무엇을 하려고:

기본적으로 나가고 싶어하는 클래스를 만들었다는 성분 자신과 관계가 있지만,나는 원하지 않았을 포함 된 개체를 포함하는 다른 물체 및 그러므로 만들기 체인으로 많은"이 가지고 있 a A a A a A a..."관계입니다.그래서 내 생각에서 시간은 다음과 같은 것이 가능합니다.

public class A : A.AA
{
    public class AA
    {
        // All of the class's logic
    }

    private AA _containedObject;
}

는 시간에게 매끄러운 그러나 돌이켜 보면 나도 그렇지 않습니다.

난 뒤져를 통해 Google 및을 찾을 수 없는 어떤 좋은 토론에서 그것은 그래서 나는 게시물을 것 이라고 생각합니다.

그러나,의견의 시에는 에릭 프라하의 블로그 그는 그에게 예의를 구현하는 클래스에서는 중첩된 인터페이스뿐만 아니라 클래스를 구현하는 일반 인터페이스를 가진 중첩된 클래스 형식으로 인수(는 컴파일하지 않고 그 통화에서"버그"로 현재 컴파일러).모두의 예제에 관심 인터페이스가 있었다 어떤 특별한 규칙이 중첩된 클래스입니다.고 있는 것 같다.

할 수 있었 이를 방지(적어도와 인터페이스)를 상속하여 별도의 클래스에서 포함된 중첩된 인터페이스가 있습니다.(에서 나의 시나리오 나는 또한 반환을 참조하여 이러한 인터페이스가 있습니다.)

는 대신:

public class MyClass<T1, T2, T3> :
   MyClass<T1, T2, T3>.Interface
where T1 : ...
where T2 : ... 
where T3 : ... {
   public interface Interface { Interface SomeMethod(); }

   Interface Interface.SomeMethod() {
      ...
   }
}

// compile error: Circular base class dependency

다음과 같은 것이 가능합니다.

public sealed class MyClassInterfaces<T1, T2, T3>
where T1 : ...
where T2 : ... 
where T3 : ... {
   public interface Interface { Interface SomeMethod(); }
}

sealed class MyClass<T1, T2, T3> :
   MyClassInterfaces<T1, T2, T3>.Interface
where T1 : ...
where T2 : ... 
where T3 : ... {
   MyClassInterfaces<T1, T2, T3>.Interface
   MyClassInterfaces<T1, T2, T3>.Interface.SomeMethod() {
      ...
   }
}

을 피하 면으로 명시적인 인터페이스를 구현할 수도 있습에서 상속 다른 클래스,비록 작동하지 않는 경우에 당신이 하려고 했던 상속에서 중첩된 클래스,수 없기 때문에서 상속되고 있어요.

public abstract class MyClassInterfaces<T1, T2, T3>
where T1 : ...
where T2 : ... 
where T3 : ... {
   public interface Interface { Interface SomeMethod(); }
}

sealed class MyClass<T1, T2, T3> :
   MyClassInterfaces<T1, T2, T3>,
   MyClassInterfaces<T1, T2, T3>.Interface
where T1 : ...
where T2 : ... 
where T3 : ... {
   Interface Interface.SomeMethod() {
      ...
   }
}

이 나에게 아무 의미가 없습니다...을 확장하기 위해 노력하고 있지 않는 무언가 존재합니다!클래스 B 만 존재하는 범위에서 클래스 A 그리고 이것 때문에 제가 있다고 생각하는 어떤 종류의 유산입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top