儿童班的实例?

时间:2010-02-17 11:34:12

标签: c# .net inheritance

如何在C#中创建子类的实例?

public class Parent
{
    public virtual void test()
    {
        Console.WriteLine("this is parent");
    }
}

public class Child : Parent
{
    public override void test()
    {
        Console.WriteLine("this is from child");
    }
}

public static void main()
{
    //Which one is right below?

    Child ch = new Child();

    Parent pa = new Parent();

    ch = new Parent();

    pa = new Child();

    ch.test();

    pa.test();
}

3 个答案:

答案 0 :(得分:3)

在您的代码中,您有四个实例,这些实例意味着略有不同:

// create a new instance of child, treat it as an instance of type child
Child ch = new Child();

// create a new instance of parent, treat it as an instance of parent
Parent pa = new Parent();

// this will not compile; you cannot store a less specialized type in a variable
// declared as a more specialized type
Child ch = new Parent();

// create a new instance of child, but treat it as its base type, parent
Parent pa = new Child();

哪一个(有效的三个)正确取决于你想要达到的目标。

请注意,以下两种情况都打印“这是来自孩子”:

Child ch = new Child();
ch.test();  

Parent pa = new Child();
pa.test();

答案 1 :(得分:2)

如果您想要Child的实例,则new Child()是正确的选择。但是,由于ChildParent的特化,您可以通过ChildParent引用(ch和{{1}来引用它在你的例子中)。

因此,您必须决定是以pa还是Child来访问该实例。

如果你这样做

Parent

您有Child ch = new Child(); 类型的引用,ch指向Child的实例。

如果你这样做

Child

您有Parent pa = new Child(); 类型的引用,pa指向Parent的实例。即你正在利用继承在ChildParent之间建立“是一种”关系这一事实。

换句话说,Child类型是Child的特化。因此,Parent的实例可以在需要Child的实例的任何地方使用。

答案 2 :(得分:1)

这往往比你想象的更基础! 我建议你阅读一篇解释你遗产的文章。多态性,例如msdnmsdncodeproject

对我来说,更多的是给出解释而不是解决方案......