繁体   English   中英

强制儿童班实施会员班

[英]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();
    }
}

现在,我创建一个名为FooChildFoo子类。 由于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 -的情况是相同的,如果你不是宣称BarFoo (比实际上它是嵌套等)。

当您用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM