C# 多態

來源:互聯網
上載者:User

標籤:實現   The   寫代碼   color   賺錢   over   mon   建構函式   方法   

說完了繼承,說多態。

所謂多態,即為多樣。很顯然這個多態/多樣不是生物學中的那個名詞。不過還是可以往這上面靠靠。

在講多態之前,讓我們思考一下代碼:

class NameList    {        public NameList() => Console.WriteLine("這個是NameList的建構函式");        public NameList(string Name) => Console.WriteLine($"這個是NameList的重載建構函式,輸入的參數是{Name}");        ~NameList() => Debug.WriteLine("釋放NameList");        public string Name { get; set; }        public void ID() => Console.WriteLine($"我的id是{Name}");        public void Show<T>(T type) where T : NameList => Console.WriteLine(type.GetType().FullName);    }    class A : NameList    {        public A() : base() => Console.WriteLine("這是A類的初始化,也就是建構函式");        public A(string Name) : base(Name) =>Console.WriteLine($"這個是A的重載建構函式,輸入的參數是{Name}");        ~A() => Debug.WriteLine("釋放A");        public void ShowType() => base.Show<A>(this);        public void ID() => Console.WriteLine("這個ID方法是A類");    }    class B : NameList    {        public B() : base() => Console.WriteLine("這是A類的初始化,也就是建構函式");        public B(string Name) => Console.WriteLine($"這個是B的重載建構函式,輸入的參數是{Name}");        ~B() => Debug.WriteLine("釋放B");                    }

 emm

 基本結論:

 1 A,B兩類都是繼承NameList

 2 A,B兩類雖然繼承NameList但是很少用到父類的方法。甚至還有寫需要隱藏父類成員。

 3 父類其實很限制子類

換句話說,其實AB類可能不需要父類的方法,有可能只是需要一個名字,父類的方法的實現子類並不需要,子類有自己的想法,有自己的做法。

ok,我們知道了這些東西,那麼我們先其他放一放,先說個故事:

  有一個爸爸和一個兒子, 爸爸有500萬,和一個公司。 兒子都繼承了下來,兒子很需要500萬,但不滿意公司的做法,甚至公司整體。 兒子有自己的想法,對公司進行改造。

(1)如果這個這個爸爸是一個沒有遠見的人,不在乎兒子怎麼想,就那麼直接將東西繼承給兒子,兒子有可能很被動,因為有部分需要,有部分不需要,又不可能扔掉,或者選擇視而不見,要麼頂著壓力改造。

(2)但如果這個爸爸是一個很有遠見的人,很在在乎兒子,由爸爸可能會對他的資產進行整理,比如公司,也許兒子不喜歡,爸爸會對公司進行設定,告訴公司以後要聽兒子的。但對錢很可能就不管了,因為兒子沒有理由不喜歡是不是。

 

1,2很顯然是兩種結果,我們不妨用代碼實現一下。

所以 ,我們要重新編寫代碼了【原有的代碼實在是太雜亂了】

(1)結果一

 class Father    {        public int Money => 500;         public void Comany() => Console.WriteLine("公司年年都賺錢!!!!");    }    class Son : Father     {        public Son() => Console.WriteLine($"我繼承了我爸的{Money}");        public new void Comany() => Console.WriteLine("我不是很喜歡我的我爸爸的公司");            }

 

兒子還是很強硬的,結果一的代碼,我們基本全都能以現在的代碼

但是第二種呢? 仔細思考一下,公司可以是聽爸爸的,也可以聽兒子,這取決於兒子是否想要對公司是否改造,或者直接接手。 如果改造爸爸還是高興,畢竟爸爸同意了

我們現有的知識可以完成嗎? 恐怕是不能的,雖然我們可以用new關鍵字來進行隱藏父類,但是這不符合爸爸高興,這一要求啊。

那麼怎麼辦呢?

來 先看代碼:

class Father    {        public int Money => 500;         public virtual void Comany() => Console.WriteLine("公司年年都賺錢!!!!");    }    class Son : Father     {        public Son() => Console.WriteLine($"我繼承了我爸的{Money}");        public override void Comany() => Console.WriteLine("我不是很喜歡我的我爸爸的公司");            }

有兩個新東西:

Virtual 和 override

Virtual :虛擬化

override:重寫

父類的方法體前加上virtual,意味著子類可以重寫這個方法。

子類的方法前加上override,意味是子類重寫父類的方法。

這些東西叫做重寫

當你編寫父類時,想某些方法可以在子類中重寫,可以使用virtual,子類中重寫使用override

C# 多態

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.