首先,我想说的是,如果以下情况可能,我主要感兴趣,并且我不打算在任何地方实际实现它,因为这样糟糕的设计目前并不相关。我知道这可以通过使用虚拟功能轻松实现。
问题解释
以下是我想要实现的一个例子。这绝不是正确的C#。
假设我有一个类Foo
,其中包含一个抽象类Bar
,然后包含一个函数Foobar
。类Foo
在受保护函数中的某处使用此Foobar
函数。这是不正确的C#,因为你不能创建一个抽象类的实例。
Class Foo
{
protected abstract class Bar
{
public void Foobar();
}
public void RandomFunction()
{
Bar bar = new Bar();
bar.Foobar();
}
}
我现在创建一个Foo
的子类,名为FooChild
。由于Bar
是抽象的,FooChild
被强制覆盖此类。
Class FooChild : Foo
{
override class Bar
{
public void Foobar()
{
Console.WriteLine("This is FooChild.");
}
}
}
假设这个程序有不同的部分,需要一个类Foo
的实例。
void UseFoo(Foo myFoo)
{
myFoo.RandomFunction();
}
他通过其他一些功能获得这个课程。但是,由于FooChild是Foo的孩子,因此可以将其传递给函数。
UseFoo(new FooChild());
该计划的预期结果将是:
这是FooChild。
我的问题是,正确的语法是什么,或者说是为什么这是不可能的。
答案 0 :(得分:1)
重要的是要记住C# nested types是静态构造。因此,嵌套在Bar
中的抽象Foo
与子类化Foo
没有任何实际关系 - 如果您在Bar
之外声明Foo
,情况就会相同(除了它嵌套的事实)。
当您使用Foo
继承FooChild
时,您会继承与FooChild.Bar
相同的Foo.Bar
,这有点令人感到困惑 - 但这是静态成员继承因此,实际上只是范围问题。
现在删除Bar
的嵌套,你的问题实际上归结为你注意到的无效C#:
Bar bar = new Bar();
由于Bar
是抽象的,某人需要子类Bar
才能创建该类型的东西。您可以安排从外部传入,或直接在子类中创建。或者,如果您想强制子类也是Bar
的子类,您可以在Foo
上使用抽象工厂方法:
abstract class Foo
{
public abstract Bar CreateBar();
public void RandomFunction()
{
Bar bar = CreateBar();
bar.Foobar();
}
}
请注意,您的子类是否将派生的Bar
子类创建为嵌套类或顶层是否与此设计无关。