簡體   English   中英

C#中的繼承和C#中的對象創建

[英]Inheritance in c# and object creation in c#

我有以下類之一是SuperClass ,它是由ChildClassChild1Class繼承的 屏幕截圖

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");
    }
}

現在,當我創建一個類似下面的對象時,我不明白它們之間的區別是什么。 我已經閱讀了很多與此相關的博客,但是我沒有找到任何合理的答案,請幫助我了解此處實際發生的情況,或者向我建議一個好的博客或文章,包括關於SO的文章,在這里我可以理解其背后的整個概念為什么我們需要在實際實時使用這些概念的地方?

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

我附上了在運行時生成的watch的屏幕截圖,為什么有一個由所有屬性組成的obj1但是我只能訪問SuperClassprop

在此先感謝您的幫助。

這是您的主題的更實際的示例:

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);
    }
}

輸出:演奏鼓演奏鋼琴

我不明白這些之間有什么區別。

主要區別之一是構造函數調用

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

對於obj1 ,在SuperClass構造函數之后調用ChildClass構造函數,並且還對屬性Childclassprop進行了字段和屬性初始化

包括所有屬性,但我只能訪問SuperClassprop?

變量obj1仍然是SuperClassprop類型,因此在編譯時僅允許您查看和使用屬於此類的變量。 如果要實際訪問ChildClass的變量,則必須將其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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM