今天學習到c#的抽象類 感覺有點懵 有大神能用通俗易懂的語言解答下嗎
uj5u.com熱心網友回復:
多型 簡單來說 就是 OOP的多種形態比如說 猴子,有十幾個種類,狐猴、懶猴、嬰猴、指猴、跗猴等
為了把這些猴子的共同形態抽象出來,做成一個介面,讓其它各自有自己特征的猴子繼承
這種模式就稱之為多型
uj5u.com熱心網友回復:
介面我還沒學到 剛學到多型 花費了一天時間來理解 感覺似懂非懂
uj5u.com熱心網友回復:
接著樓上的說吧,猴子都要吃東西,
所以 在猴子類里面 加一個 吃東西的方法
不同的猴子 繼承了 猴子類 重寫吃東西的方法
比如說 狐猴 吃 桃 嬰猴 吃 香蕉 懶猴 沒吃到
然后你宣告的時候這樣
猴子 猴1 = new 狐猴()
猴子 猴2 = new 嬰猴()
猴子 猴3 = new 懶猴()
猴1 猴2 猴3 都是猴子類 ,
但是 你呼叫
猴1.吃東西()
猴2.吃東西()
猴3.吃東西()
是不同的
這就是多型~
uj5u.com熱心網友回復:
剛接觸 很多概念上的東西 不理解沒關系,不耽誤寫程式,多寫寫,自然就懂了 實踐是最好的老師uj5u.com熱心網友回復:
多型是面向物件的三大特性之一。簡單說就是同一個父類,不同子類,子類繼承父類后,重寫父類中的方法,用的時候,父類作為型別,實體化具體子類,呼叫重寫方法時,表現出不一樣的反應,這就是多型。
uj5u.com熱心網友回復:
怎么又來一個抽象就是抽象的中文含義
人說“你長的很抽象”這句話你怎么理解。
你腦袋里想到什么了?反正很抽象,不好看對吧
至于怎么樣的不好看?反正很多種可能,長啥樣都可能,就是不好看(對了把,不好看是你抽象的共性,長啥樣都可能就是多型)
這玩意別糾結代碼,本來就是現實如此,代碼如此。
現實里有,代碼里就有。上有政策,下有對策,偷梁換柱,李代桃僵現實里有吧,所以代碼里有overide。(舊瓶裝新酒,瓶是你的瓶,酒是我的酒,反正酒換了,柱子換了)
現實里“你指鹿為馬,你官大,你說滴對,但我就干我的”,代碼里就有new,到我的就用我的馬,如果轉到你那里,“對,你說的對。這絕對是鹿,肯定不是馬”
uj5u.com熱心網友回復:
有本書叫“我不是教你耍詐”我現在也不是教你耍詐。
只是物件化編程本身出現的原因就是因為,程式修修改改太多,專案推倒重建太多
人們總結了一下,怎么來避免。于是就產生我上面說的東西。
你想如果寫程式的是上面那些“狡猾狡猾滴”人寫的,這專案是不是更容易成功
uj5u.com熱心網友回復:
物件化的最初設計想法就是“我們怎么才能做一個能應對各種可能的模型,讓他不那么容易被推倒重建”所以這是初心,你可以忘記代碼,可以忘記設計模式,但這個初心絕不能忘
忘的這個初心,就很容易被技術,技巧給迷惑。
記住這個初心,你就能理解你書上說的那些東西。那些東西一切的原則都是,他不能垮,我的抽象能盡可能滿足后面的變化。
我們不是神,做不到我說要怎么樣就怎么樣,但是我們起碼要保證在我能力的范圍內,這專案能快速應對各種要求
uj5u.com熱心網友回復:
C#是一種編程語言,也是一種商品。在C#問世的時候,微軟考慮的問題是,拿出一種有競爭力的設計,給程式員們一個使用C#而不是別的編程語言已經很好的理由。微軟從來也不是一個學識訓構,蓋茨骨子里就是一個商人。因此,任何C#編程語言的特性,包括抽象類的存在,不是為了存在而存在,也不是為了讓學生無法通過考試而存在,而是有實際功能的。
所以你的思維必須改變,你應該去理解的是編程語言中語法特征的使用的動機,而不是追求通俗易懂的比喻。因為即便那些比喻通俗易懂,但是還是沒有解釋一個關鍵的問題,就是為什么C#需要這么一個語法特性。
你要明白的是,只要學習一種語言的基本的幾個語法特性,就可以開始撰寫程式了。而只有你開始撰寫程式了,你才會自己去體會到別的語法特性的方便之處在哪里。
好比學駕駛,我從來沒有看到一上來學習汽車上的座椅怎么加熱,或者播放器怎么操作的。
uj5u.com熱心網友回復:
你還在學習,所以對于你們來說,這一切難于理解。如果悟性好能理解那還好,悟性不好,只能等你作業了,讓你的產品經理來調教你(注意:不是技術經理調教你,是產品經理調教你,產品經理各種天馬行空,稀奇古怪的玩法,絕對不止我說那些指鹿為馬,偷梁換柱的搞法,還有更多匪夷所思的玩法。至于你的技術經理通常的要求是“你別總跟產品經理說這個不能做。那個不能搞,你們這樣我開會很難辦啊,人家的問題人家不提,開會的炮火全體炮轟技術,說你們技術不管提啥都是,不會,不行,不能”)
PS:物件化其實是不適合初學者學的東西,他來源于實踐。參考于哲學,方法論,策略論,工程論。初學者其實學python跟容易,所以你看哪怕是學數學的玩python都好辦,你讓一個學數學的過來玩玩物件化估計一年半載都難領會這種“狡詐”的思路
uj5u.com熱心網友回復:
我帶新人學物件編程,喜歡讓他們陪我下圍棋(中午休息,如果不想睡,可以殺一盤)why,其實這個程序和學物件化的程序一樣。
物件化最終是策略,方法論,是風險評估和預測。而不是寫代碼,真正入門物件化的人實際并不會對如何寫代碼糾結。
物件化入門的人反而糾結的是可以選擇的方向太多了,到底那種方向才能更符合未來的。
話說回來,干嘛讓他們下圍棋,其實看看下圍棋怎么入門的。
第一步死活,你的告訴他,那死,那活。怎么保證活,這就是現在的,最起碼語法無誤,編譯能過,運行符合預期
第2步殺大龍,過了第一關的人,就得準備殺大龍了,他還不會看大局,一切圍繞著怎么吃掉對方大龍,完全纏繞式攻擊。吃不了對方就敗。這個在剛入門的程式員也是一樣,你給個功能,他們會全力去做加班去做,大局什么的完全不考慮的,成了就成了,敗了就大敗
第3步,背定式。告訴他們固定的解決模式,雖然不是最優,至少不虧。大部分net的人都這步,你開這里就明白了。套框架,玩模式,套分層,玩注入,搞倉儲
第4步 識大局,判形勢,懂保留,玩策略
第5步 其實這步就不用我教了,到這里他會自己有自己玩法了,甚至我還得反過來學他的了
PS:其實你問的抽象這層,真正想弄明白了,至少是第4步,所以我說物件化其實并不適合初學,不過沒關系,就像上面說的。先照著弄把,弄多了。那天悟了就悟了。再不濟也跟這里大多數人一樣,背定時套框架也能有飯吃
uj5u.com熱心網友回復:
學了兩天 似懂非懂 感覺比昨天又理解深了一點uj5u.com熱心網友回復:
學了兩天 似懂非懂 感覺比昨天又理解深了一點
uj5u.com熱心網友回復:
抽象類和介面的共同點就是,大家跟著約定來實作。但是抽象類偏向整體概念,
介面是零散的部件。
你就認為,人家幫你定了一個class。
你只要按著人家定義的抽象類繼承實作就好了 。
uj5u.com熱心網友回復:
一位伐木工有三個兒子父親打算讓兒子們繼承伐木工這份作業
父親死后,三個兒子都繼承了父親這份職業
大兒子覺得父親的用斧頭砍樹的方法很好,依舊用斧頭砍樹
二兒子覺得斧頭砍樹太慢了,就換成電鋸鋸樹
三兒子就有些厲害了,是高壓水槍沖擊大樹
劇情模擬!!!
uj5u.com熱心網友回復:
多型是要跟繼承結合起來看的。比如現在要實作一個動物的產品族,那么首先就要把動物共有的特征羅列出來,比如動物都有吃這個動作,那么可以定義一個Animal類作為父類:public class Animal
{
public virtual void Eat()
{
Console.WriteLine("動物吃東西");
}
}
由于動物這個概念很抽象,因此接下來就是把動物這個概念具體化,比如動物有貓、狗之類的,這里就需要使用類的繼承:
public class Cat : Animal
{
public override void Eat()
{
Console.WriteLine("我是貓,我愛吃魚");
}
}
public class Dog : Animal
{
public override void Eat()
{
Console.WriteLine("我是狗,我愛吃肉");
}
}
virtual代表虛方法,可以被子類重寫,override就是在子類中重寫父類的虛方法或抽象方法。最后一步就是創建物件,估計樓主一般會使用如下的方法創建物件:
Cat cat = new Cat();
Dog dog = new Dog();
這種創建物件的方法能實作目的嗎?當然可以!但這同時也使得程式的靈活性大打折扣,比如現在想要將一個動物類的實體當做形參傳入到函式里面,如果按照上面的寫法,你得同時定義兩個函式:
static void Print(Cat cat)
{
cat.Eat();
}
static void Print(Dog dog)
{
dog.Eat();
}
這樣的后果就是一旦對動物類別進行擴充,又得對Print函式進行多載,導致程式毫無擴展性。如果利用繼承和多型的特性,可以這么定義函式:
static void Print(Animal animal)
{
animal.Eat();
}
這樣做的好處就是不管是雞鴨牛羊還是其他什么,只要繼承了Animal類,那么都可以當做引數傳進來。所以樓主要習慣利用繼承和多型創建物件:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Animal cat = new Cat();
Print(cat);
Animal dog = new Dog();
Print(dog);
}
static void Print(Animal animal)
{
animal.Eat();
}
}
public class Animal
{
public virtual void Eat()
{
Console.WriteLine("動物吃東西");
}
}
public class Cat : Animal
{
public override void Eat()
{
Console.WriteLine("我是貓,我愛吃魚");
}
}
public class Dog : Animal
{
public override void Eat()
{
Console.WriteLine("我是狗,我愛吃肉");
}
}
}
uj5u.com熱心網友回復:
多型首先要講繼承老爹是個C#程式員,
兒子繼承了老爹,并且會用C# 這是繼承
多型
兒子繼承了爹的C#,并且學會了java編程,這是多型
至于介面
兒子學會了開車,這是實作了介面
如果看不懂在舉一個例子
緝毒犬繼承了狗這個抽象(你可以說緝毒犬是狗,但不能說狗是緝毒犬)
這是多型
而緝毒這個功能則是實作了介面
總體來說就是
父的行為在兒子的身上有不同的體現,這是多型
uj5u.com熱心網友回復:
多實踐,有的概念慢慢自然理解,摳字眼沒多少用uj5u.com熱心網友回復:
猴子都要吃東西,所以 在猴子類里面 加一個 吃東西的方法
不同的猴子 繼承了 猴子類 重寫吃東西的方法
比如說 狐猴 吃 桃 嬰猴 吃 香蕉 懶猴 沒吃到
然后你宣告的時候這樣
猴子 猴1 = new 狐猴()
猴子 猴2 = new 嬰猴()
猴子 猴3 = new 懶猴()
猴1 猴2 猴3 都是猴子類 ,
但是 你呼叫
猴1.吃東西()
猴2.吃東西()
猴3.吃東西()
是不同的
這就是多型~
uj5u.com熱心網友回復:
我是個編程小白 您說的我現在還不能完全理解
uj5u.com熱心網友回復:
謝謝大佬





uj5u.com熱心網友回復:
大佬我想問下那個Print這個方法是啥意思uj5u.com熱心網友回復:
說句白話,按照遺傳來說明,你父親會給你帶來基因遺傳,而你有自己的特性。這就是多型。
還有一個就是 你父親說了句話,你不同意就給改了然后又告訴給人,這也是多型的一種。
uj5u.com熱心網友回復:
Print就是一個普通的方法,在里面呼叫Animal類的Eat方法,它的形參是一個Animal實體,只要某個類繼承了Animal類,那么這個類的實體就可以當做引數傳遞進去,因為子類可以隱式轉換為父類。uj5u.com熱心網友回復:
其實就是人類對于事物的一種分類方法,把多個有相似功能或結構的事物統一一個分類。比如行駛在路上的東西叫做車,車就相當于一個介面,車又分為很多種,比如摩托車、小轎車、越野車等等,這些都可以歸為車這個類別,這就是多型了uj5u.com熱心網友回復:
抽象類嘛,就是不能實體化的類,不能把他具體出來,比如動物就是抽象類,而狗就可以理解為它的子類,你可以實體化為一條狗,而抽象類動物就不可以uj5u.com熱心網友回復:
看大佬解釋,跟著學習下
uj5u.com熱心網友回復:
很正常,有的程式員作業了2年才真正明白了oop當然誰都不例外uj5u.com熱心網友回復:
學習下
uj5u.com熱心網友回復:
爸爸有三個兒子,哥哥,弟弟和你,你們都繼承你爸抽煙的習慣,同樣是抽煙,但你喜歡抽玉溪,哥哥喜歡抽中華,弟弟喜歡抽紅梅。這就是多型,繼承父類,實作父類的成員,有不同的表現。這樣好處是,你不用再宣告一個你會抽煙的方法,哥哥也不用再宣告一個會抽煙的方法~~uj5u.com熱心網友回復:
你知道猴子(抽象類)會吃飯(抽象類里沒有具體實作的方法),具體怎么吃(實作類中方法的實作)就是每個猴子(實作類)自己的事了uj5u.com熱心網友回復:
總之就是對一個事物逐漸的抽象。最頂的就是最基本的。越往下分類越多。金字塔結構uj5u.com熱心網友回復:
OPP的多種形態uj5u.com熱心網友回復:
大神門都好有耐心啊!!!
其實這些剛學沒必要搞得那么懂,后面練手慢慢就懂了
uj5u.com熱心網友回復:
子類可以變換的uj5u.com熱心網友回復:
書桌上有3本書,你現在要收拾書桌,那動作是 第一本書 .放書架 ,第二本書.放書架,第三本書.放書架。這動作有點重復,想到了用回圈,把書放到一個集合去。
桌子上的書={第一本書,第二本書,第三本書}
for each 書 in 桌子上的書
書.放書架
next
完美。
但桌上除了書,還有茶杯、廢紙,要收拾有點麻煩, 第一本書 .放書架 ,第二本書.放書架,第三本書.放書架,一個茶杯.倒茶渣,一個廢紙.扔廢紙簍。
要還是想用一個指令收拾就有點麻煩了,放不到一個集合,回圈呼叫的方法也不一樣。
多型就派上用場了,這些東西都可以抽象為桌上的東西,有收拾方法。
定義一個 “桌上東西” 類,有一個 “收拾”方法。
書、茶杯、廢紙 派生與“桌上物品”,實作各自的“收拾”方法,內容分別是放書架、倒茶渣、扔廢紙簍。
現在就可以繼續愉快的用回圈了
桌上的物品={第一本書,第二本書,第三本書,一個茶杯,一張廢紙}
for each 物品 in 桌上的物品
物品.收拾
next
uj5u.com熱心網友回復:
抽象,抽象,抽象。我一開始也不能理解,為什么叫抽象,抽象這個詞應該是從哲學中來的,就是把一些相同的實際的東西,總結其特點,變成一個可以代表這些東西的一個概念,用到編程中的意思就是,把很多相同的類,總結他們的相同的特點,然后總結出一個可以代表這些類的類。uj5u.com熱心網友回復:
多型一種形式多種狀態uj5u.com熱心網友回復:

其實就是同一個函式在不同類中不同表現
舉個栗子:
public class A
{
public virtual void Log()
{
Console.WriteLine("123");
}
}
public class B:A
{
public override void Log()
{
Console.WriteLine("321");
}
}
在A的時候輸出123,在B的時候輸出321
當你呼叫的時候就可以
uj5u.com熱心網友回復:
public interface IA
{
void Log();
}
public class B:IA
{
public void Log()
{
Debug.Log("321");
}
}
public class C : IA
{
public void Log()
{
Debug.Log("321");
}
}
不同的類繼承介面后相同的函式不同的表現
uj5u.com熱心網友回復:
多型,顧名思義就是多種形態。是指父類通過指向不同的子類而表現出的特性,因為子類對父類方法的實作不同,所以當父類指向不同子類時,通過父類呼叫父類方法,執行結果不同uj5u.com熱心網友回復:
比如動物這個類,有吃東西這個能力,狗是動物,豬也是動物,但是吃東西是不一樣的,uj5u.com熱心網友回復:
從軟體工程來講 多型可以簡化成 介面 方法 的多型 不同的方法實作介面定義的這個方法 就是多型了。 基于介面 方法 比較好理解。不同的類似的方法可以實作介面的同一個方法。一般一個介面寫一個方法 讓子類的不同的方法去實作這個介面的方法。 這樣就是多型 松耦合了,同時也是簡單的基于介面的編程。 繼承少用為好 基本上被專家們判死刑了。因為繼承增加了耦合性,無法很好的進行多型,擴展。uj5u.com熱心網友回復:
今天學習到c#的抽象類 感覺有點懵 有大神能用通俗易懂的語言解答下嗎
面向物件語言是要有一個思維的轉換,C#,JAVA,還有其他的面向物件,解釋什么是抽象類,這些找個網課視頻都有!最主要的是您要明白他的作用是什么!說的是它在你整程式中的作用,比如if陳述句是用來判斷的,對于抽象類,它會轉換為后期的介面,等講到借口你就會發現,你管穿了這個內容,現在講抽象類,是為了讓你在后講介面更好的理解,總歸言之,對于學編程語言,就是多敲代碼,現在初期一天300行代碼,認真的去敲一遍會發現你基本上屬于自己慢慢能運用了!
uj5u.com熱心網友回復:
多敲代碼是最好的方法uj5u.com熱心網友回復:
今天學習到c#的抽象類 感覺有點懵 有大神能用通俗易懂的語言解答下嗎
人 都有尿尿的方法。
男人的尿尿方法是 站著的
女人的尿尿方法是 蹲著的
同樣是尿尿,不同類別的人,表現出來是不一樣的,這就是多型。
uj5u.com熱心網友回復:
說句白話,按照遺傳來說明,你父親會給你帶來基因遺傳,而你有自己的特性。這就是多型。
還有一個就是 你父親說了句話,你不同意就給改了然后又告訴給人,這也是多型的一種。
uj5u.com熱心網友回復:
一篇面向物件基礎的博客: https://blog.csdn.net/MrBaymax/article/details/84308600uj5u.com熱心網友回復:
諸位很努力了。觀程式員世界,極少是老師出身的,那么傳播知識必會造成障礙。
包括經典教材,舉的例子甚至不如看了教材并在行業內幾年經驗的過來人說得明白……
要想把語言通俗點講解,必需要用受眾能理解的事物來。
現在看來,必是游戲無疑。
委托不就是你去接任務?
事件不就是你打怪的進度通知?
選人界面下的各個職業它們最終不是同一個父類,這就是多型了啊!它們不是有共用的東西,叫介面?如攻擊防御魔法
這是我最近又重回WOW時的發現,里面隨便拿一些東西來說都滿滿是編程的思想。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/122620.html
標籤:C#
