할 수 없는 이유 클래스를 확장하는 그것의 자신의 중첩된 클래스에서는 C#?
-
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 그리고 이것 때문에 제가 있다고 생각하는 어떤 종류의 유산입니다.