c#中的继承和c#中的对象创建

时间:2017-02-28 11:22:13

标签: c# inheritance

我有一个类,其中一个是SuperClass,由ChildClassChild1Class继承 ScreenShot

public class SuperClass
{
    public new int Superclassprop = 2;
    public virtual void play()
    {
        Console.WriteLine("SuperClass");
    }

}

public class ChildClass : SuperClass
{
    public new int Childclassprop = 2;

    public override void play()
    {
        Console.WriteLine("ChildClass");
    }

}
public class Child1Class : SuperClass
{
    public new int Childclassprop = 3;

    public override void play()
    {
        Console.WriteLine("Child1Class");
    }
}

现在,当我创建一个类似下面的对象时,我不明白这些之间有什么区别。我已经阅读了大量与此相关的博客,但我没有找到任何合理的答案,请帮助我了解这里发生了什么,或者建议我一个好的博客或文章,包括在哪里,我可以理解一个完整的概念这背后为什么我们需要这个实际使用这些概念的地方?

SuperClass obj = new SuperClass();
SuperClass obj1 = new ChildClass();

我附上了在运行时生成的手表的屏幕截图,为什么obj1包含所有属性,但我只能访问SuperClassprop

在此先感谢任何帮助将非常感谢。

2 个答案:

答案 0 :(得分:4)

以下是您主题的更实用示例:

using System;

 public class Music
    {
        public virtual string play()
        {
            return "Play Music";
        }
    }

    public class Drum : Music
    {
        public override string play()
        {
            return "Play Drums";
        }
    }

    public class Piano : Music
    {
        public override string play()
        {
            return "Play Piano";
        }
    }

    public class PlayMusicService
    {
        private readonly Music _musicContext;
        public PlayMusicService(Music musicContext)
        {
            this._musicContext = musicContext;
        }

        public string PlayAlbum()
        {
            return _musicContext.play();
        }        
    }


public class Program
{
    public static void Main()
    {
         string whatPlayed = "";

        Drum drums = new Drum();        
        PlayMusicService music1 = new PlayMusicService(new Drum());     
        whatPlayed = music1.PlayAlbum();
        Console.WriteLine(whatPlayed);

        Piano piano = new Piano();
        PlayMusicService music2 = new PlayMusicService(new Piano());
        whatPlayed = music2.PlayAlbum();
        Console.WriteLine(whatPlayed);
    }
}

<强>输出: 打鼓 弹钢琴

答案 1 :(得分:3)

  

我不明白这些之间有什么区别。

主要区别之一是构造函数调用

SuperClass obj = new SuperClass();
SuperClass obj1 = new ChildClass();

obj1的情况下,在ChildClass构造函数之后调用SuperClass构造函数,并且对属性Childclassprop进行字段和属性初始化

  

包含所有属性,但我只能访问SuperClassprop?

变量obj1仍为SuperClassprop类型,因此在编译时您只能查看和使用属于此类的变量。如果您想要实际访问ChildClass的变量,则必须将其转换为正确的类型:

var r = (obj1 as ChildClass).Childclassproput;
  

为什么我们需要这个实际使用这些概念的地方?

我想到的一个场景是:在编译时可能不清楚哪个类必须实例化。但这是在运行时决定的。但是您需要一个变量来编写特定play()方法的调用。在运行时,将决定最终调用哪个方法。

SuperClass obj = new SuperClass();

bool condition = false;
if (condition)
{
    obj = new ChildClass();
}
else
{
    obj = new ChildClass1();
}

// now just call the method and the proper method will be called
obj.play();