C# interface , abstract , virtual 差異 解說.....
以前大學時代學C++,其實對於物件導向的功能與觀念還算清楚,不過畢業後反來很少用到物件導向的進階功能,慢慢的很多東西的定義就慢慢忘掉了....
重溫一下基本...雖然也不一定會常用到
interface , abstract , virtual 這幾個東西其實都很像,簡單來說都可以讓後面繼承的對像自己去實作 or 修改 method,常常會搞混,找網路教學說了一堆,說了一堆有的沒的,感覺最快還是自己測試一下各功能的sample,馬上就會知道差異,用了那種關鍵字,那種功能是ok的,怎樣是不ok的,一目了然.
網路很多都這種教學例子... 其實如果能很輕易看懂這類文章的人,大概都是已經會了的人.
http://missrices.pixnet.net/blog/post/28220534
http://jjnnykimo.pixnet.net/blog/post/21585257
so...既然已經會了的人才容易看懂,那又何必看呢?
PS.簡單來說...以功能導向的小程式,做些小DMEO跑一下,列出結果差異,就明白了.
namespace MySample
{
//介面
interface SampleInterFace
{
void testMethod();
//下面反註解掉會編譯錯誤,介面的method被實做必定得是public屬性,但本身不能宣告屬性
//public void testMethod();
//下面反註解掉會編譯錯誤,介面裡頭不能宣告fields
//int test;
//下面反註解掉會編譯錯誤,介面裡頭不能有任何真正實做
//void testMethod() { }
}
class test1 : SampleInterFace
{
//若沒這下面實作,會編譯報錯
public void testMethod()
{
throw new NotImplementedException();
}
}
//抽像
abstract class Sampleabstract
{
abstract public void testMethod();
//下面反註解掉會編譯錯誤,抽像類別中無實作的method一定得加上abstract關鍵字
//public void testMethod2();
//抽像類別中可以實作method
public void testMetod2()
{
Console.WriteLine("hello");
}
//抽像類別中可以定義fields
int test = 0;
}
class test2 : Sampleabstract
{
//有abstract關鍵字的methed "一定需要用" override實作
public override void testMethod()
{
throw new NotImplementedException();
}
}
class Sampleclass
{
virtual public void testMethod()
{
Console.WriteLine("hello");
}
//下面反註解掉會編譯錯誤,virtual必定需要為public屬性
//virtual void testMethod() { }
//下面反註解掉會編譯錯誤,virtual必定需要實作
//virtual public void testMethod();
}
class test3:Sampleclass
{
//有virtual關鍵字的methed "可以用" override實作
public override void testMethod()
{
throw new NotImplementedException();
}
}
}