强制子类实现成员类

时间:2014-01-16 12:37:30

标签: c# inheritance virtual

首先,我想说的是,如果以下情况可能,我主要感兴趣,并且我不打算在任何地方实际实现它,因为这样糟糕的设计目前并不相关。我知道这可以通过使用虚拟功能轻松实现。

问题解释

以下是我想要实现的一个例子。这绝不是正确的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。

我的问题是,正确的语法是什么,或者说是为什么这是不可能的。

1 个答案:

答案 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子类创建为嵌套类或顶层是否与此设计无关。