[英]Force child class to implement member class
首先,我想说的是,我主要感兴趣的是是否可以进行以下操作,并且我不打算很快在任何地方实际实施它,因为这种不良设计目前不相关。 我了解这可以通过使用虚函数轻松实现。
问题说明
以下是我要实现的示例。 绝不是正确的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();
}
}
现在,我创建一个名为FooChild
的Foo
子类。 由于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。
我的问题是,正确的语法是什么,或者是为什么这不可能的原因。
请记住, C#嵌套类型是静态构造,这一点很重要。 所以抽象Bar
嵌套在Foo
没有在子类任何真正的轴承Foo
-的情况是相同的,如果你不是宣称Bar
外Foo
(比实际上它是嵌套等)。
当您用FooChild
继承Foo
子类时,您继承了FooChild.Bar
,这与FooChild
相同,这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
子类创建为嵌套类还是在顶层创建与该设计无关。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.