C# 基类中的派生实例

C# 基类中的派生实例,c#,.net,inheritance,polymorphism,C#,.net,Inheritance,Polymorphism,这段代码构建得很好。C允许在baseClass中创建derivedClass对象的可能原因是什么。你能想出这样做的具体原因吗 这段代码构建得很好 是的,为什么你认为不会呢 C#允许在基类中创建derivedClass对象的可能原因是什么 因为没有理由禁止它 你能想出这样做的具体原因吗 例如,静态工厂方法 class baseClass { derivedClass nm = new derivedClass(); } class derivedClass : baseClass { }

这段代码构建得很好。C允许在
baseClass
中创建
derivedClass
对象的可能原因是什么。你能想出这样做的具体原因吗

这段代码构建得很好

是的,为什么你认为不会呢

C#允许在基类中创建derivedClass对象的可能原因是什么

因为没有理由禁止它

你能想出这样做的具体原因吗

例如,静态工厂方法

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

class derivedClass : baseClass
{
}
这实际上是一种很常见的模式。例如,
CalendarSystem
是一个公共抽象类,但是所有具体的派生类都是内部的,我们经常使用它

当然,有您给出的确切示例是疯狂的——实例字段通过创建派生类的实例来初始化自身——因为它会由于递归而炸毁堆栈——但这不是它是派生类的问题。通过初始化同一个类,可以得到同样的结果:


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

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

我曾经与之合作的开发人员在我们的代码库中生成了此代码。我个人同意这是有用的

class Bang
{
    // Recursively call constructor until the stack overflows.
    Bang bang = new Bang();
}

为什么你认为C#应该限制这一点?你知道有任何面向对象的语言限制这一点吗?它没有什么特别之处。我想不出在
baseClass
中创建
derivedClass
实例的原因。所以我想知道为什么C允许它?@MD.Unicorn:不。。我不知道任何语言限制这一点。但是如果它没有用,为什么不加以限制呢?如果出于某种原因,我们可以使用它,请告诉我原因。不能想出一个用法并不是禁止某些东西的好理由。我发现类被密封的次数,因为原始开发人员想不出你会继承它的情况…:它不是工厂方法如果它是静态的,你可能想写静态工厂或创建方法。@Saurabh:改为“静态工厂方法”,但我不确定这里的区别有多大好处,老实说:我在某个地方读到过关于创建方法的区别,如下所示:创建(或克隆)类实例的静态或非静态方法。工厂方法:在层次结构中定义和实现的一种方法,用于提供某些类类型的多态创建。@Saurabh:工厂方法的Wikipedia页面包含类似的示例,他们称之为“静态工厂方法”。他们指出,它不符合工厂方法模式,因为没有多态性,但在我看来,它的含义非常清楚。(顺便说一句,为什么在注释前面加“:”)@user1416420:“当然,有你给出的确切示例是疯狂的,因为它会因为递归而炸毁堆栈”没有明确说明烟囱会爆炸?
class Bang
{
    // Recursively call constructor until the stack overflows.
    Bang bang = new Bang();
}
public class Foo
{
    public static Foo MagicalFooValue
    {
        get { return Bar.Instance; }
    }

    private class Bar : Foo
    {
        //Implemented as a private singleton
    }
}