基类中的派生实例

时间:2013-02-27 07:12:26

标签: c# .net inheritance polymorphism

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

class derivedClass : baseClass
{
}

此代码构建正常。 C#允许在derivedClass中创建baseClass个对象的可能原因可能是什么。你能想到这样做的具体原因吗?

4 个答案:

答案 0 :(得分:12)

  

此代码构建正常。

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

  

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

因为没有理由禁止它吗?

  

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

静态工厂方法,例如?

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

这实际上是一种非常常见的模式。我们在Noda Time中经常使用它,例如CalendarSystem是一个公共抽象类,但所有具体的派生类都是内部的。

当然,拥有你给出的确切示例是很疯狂的 - 实例字段通过创建派生类的实例来初始化自己 - 因为它会因递归而炸毁堆栈 - 但这不是它的问题是派生类。你可以通过初始化相同的类来获得相同的东西:

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

答案 1 :(得分:1)

我以前使用的开发人员在我们的代码库中生成了这段代码。我个人认为它很有用。

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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