今天與前輩有了一段很有趣對話,算是我向對方請教了,抽象化的寫法。
一直以來我都只看過教科書上寫過,或是各大神的文章,簡單說當初的我要看我也看不太懂。
不知道為什麼對於說抽象、實作介面...看了就像是天文書。
但今天和前輩請教了,之前前輩寫了一段Api 的IRequest 簡單工廠。
其實之前我一直都不知道到底怎麼實用這些抽象化的東西。
今天總算是有消化進去了。
再搭配這篇文章
(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)
引用裡面的一段文字
interface用在當一個物件須和其他物件共同合作時,為了確保其他物件有我想要的method,所以定下interface要該物件遵守,在Design Pattern到處可以看到這種應用,如strategy,bridge,prototype...。
而abstract class是用在整個繼承體系的最上層,用來定義出整個繼承體系該有哪些method,子類別可以對這些method加以override,或維持和abstract class相同的功能。Design Pattern中的template method,factory method...等就是用這種手法。
簡單說是 interface 裡面不會定"方法內容",只會定有甚麼方法的名稱,如果繼承了這個interface就"一定"要有裡面的方法。
而abstract 則是裡面有甚麼方法不一定要被實作,但如果接了abstract的方法繼承後一定要override,而也可以選擇用virtual方法,virtual方法就可以覆寫也可以不覆寫甚至還可以直接用父類別virtual方法內的內容。
這邊我自己寫了一點Code,做好紀錄。
abstract class abstractClass
{
//一般方法
public void normalMethod() { }
//abstract方法 不能有主體內容
public abstract void testAbstractMethod() ;
//virtaul方法 一定有主體內容
public virtual void testVirtualMethod()
{
Console.WriteLine("Because Virtual must has value");
}
}
在繼承abstract 類別的時候
class testAbstractClass : abstractClass
{
//繼承後 abstract vs virtaul
//1. Abstract 必須要有 override 才可以
public override void testAbstractMethod() {
Console.WriteLine("here is testAbstractMethod");
}
//2. Virtual 就不一定要覆寫 如果不要覆寫也完全沒關係
// 但如果要叫用 testVirtualMethod的方法就一定要override
// 內容放上base.testVirtualMethod()就可以
//3. 但如果要覆寫 也還是可以
public override void testVirtualMethod()
{
//這個base 是可以執行 abstractClass virtual 的內容
base.testVirtualMethod();
Console.WriteLine("here is testAbstractClass Override Virtual");
}
}
驗證結果:
static void Main(string[] args)
{
testAbstractClass temp = new testAbstractClass();
temp.testAbstractMethod();
temp.testVirtualMethod();
Console.ReadLine();
}
那至於interface 就更單純了
interface IClass
{
//interface 只需定義好 prop 和 方法名稱
string myWord { get; set; }
void interfaceMakeWord();
}
繼承時
class testInterface : IClass
{
// interface method and prop 都一定要被實作
public string myWord { get; set; }
public void interfaceMakeWord()
{
myWord = "interfaceMakeWord should be defined here";
Console.WriteLine(myWord);
}
}
驗證結果
static void Main(string[] args)
{
testInterface testInterface = new testInterface();
testInterface.interfaceMakeWord();
Console.ReadLine();
}
這簡單的練習就幫助我,釐清interface & abstract & virtual 的用法
以後只要某些地方是需要一直重複的程式,其實就可以想一下是否可以使用interface & abstract 的Class