例如:

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

其产生这种错误的编译器:

圆形的基类的依赖 涉及'A'和'A'

我一直想有一套类表现得就像一个普通类,除非有特别的规则,关于访问外层级的私人成员,但我想有一些隐含的继承权之间发生的两类?

有帮助吗?

解决方案

有没有隐含的继承涉及的尽我所能告诉。我希望这会有事-虽然我可以想像的怪事,如果A和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.

筑巢+继承=奇怪...

其他提示

这不是C#的东西,而是编译器的东西。编译器的一个工作是在内存中布置一个类,即一堆基本数据类型,指针,函数指针和其他类。

在知道B类的布局之前,它不能构造A类的布局。在完成A类布局之前,它无法知道B类的布局。循环依赖。

我认为嵌套是为了表示嵌套类型是嵌套类型的定义的一部分。有了这种解释,这种限制是有道理的,因为当编译器达到A的定义时,A.B尚未定义,即使在A的末尾,它也已经用A.B来定义。

关于我试图做的事情的问题:

基本上,我想创建一个与自身具有组合关系的类,但我不想让包含的对象包含其他对象,因此创建一个包含许多“A has-a A has-的链”。 a A has-a A has-a ......“关系。所以我当时的想法是做这样的事情:

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

    private AA _containedObject;
}

当时看起来很漂亮,但回想起来我不太确定......

我在Google上翻找过,并没有找到任何好的讨论,所以我想我会在这里发布。

但是,在在Eric Lippert的博客上发帖他给出了一个实现嵌套接口的类的示例,以及一个实现泛型接口的类,其中嵌套类作为类型参数(不编译并且他在当前编译器中调用“bug”。这两个例子都涉及接口,所以我想知道是否有一些嵌套类的特殊规则。似乎有。

通过从包含嵌套接口的单独类继承,我能够避免这种情况(至少使用接口)。 (在我的场景中,我也返回对这些接口的引用。)

而不是:

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