4
class baseClass
{
    derivedClass nm = new derivedClass();
}

class derivedClass : baseClass
{
}

此代码构建良好。C# 允许derivedClassbaseClass. 你能想到这样做的任何具体原因吗?

4

4 回答 4

12

此代码构建良好。

是的 - 为什么你认为它不会?

C# 允许在 baseClass 中创建派生类对象的可能原因是什么。

因为没有理由禁止它?

你能想到这样做的任何具体原因吗?

例如静态工厂方法?

// BaseClass gets to decide which concrete class to return
public static BaseClass GetInstance()
{
    return new DerivedClass();
}

这实际上是一个很常见的模式。我们在野田时代经常使用它,例如,哪里CalendarSystem是公共抽象类,但所有具体派生类都是内部的。

当然,拥有您给出的确切示例真是太疯狂了-实例字段通过创建派生类的实例来初始化自身-因为它会由于递归而炸毁堆栈-但这与派生无关班级。通过初始化同一个类,你会得到同样的结果:

class Bang
{
    // Recursively call constructor until the stack overflows.
    Bang bang = new Bang();
}
于 2013-02-27T07:15:22.597 回答
1

我曾经合作过的一位开发人员在我们的代码库中生成了这段代码。我个人同意它很有用。

public class Foo
{
    public static Foo MagicalFooValue
    {
        get { return Bar.Instance; }
    }

    private class Bar : Foo
    {
        //Implemented as a private singleton
    }
}
于 2013-02-27T07:27:21.890 回答
0

一个明显的情况是在基类中有一个工厂方法,它会根据某些条件返回适当的实现。

于 2013-02-27T07:15:45.503 回答
0

derivedClass可以实例化,baseClass因为它是一个可访问的类。c# 没有理由限制你这样做。baseClass同样,您可以在其内部创建一个实例baseClass

于 2013-02-27T07:15:55.563 回答