介面、抽象類、抽象方法、虛方法 的區別
介面、抽象類、抽象方法、虛方法:
這四個名詞時非常容易混淆的:
首先說一下介面 與抽象類 的異同:
相同點:
1.他們都不能例項化自己,也就是說都是用來被繼承的。
2.抽象類中的抽象方法和介面方法一樣,都不能有方法體
不同點:
1.抽象類裡可以有欄位,介面中不能有欄位.
2.抽象類中的普通方法可以有方法體,而介面方法沒有方法體。
3.介面中的方法不能有訪問修飾符,抽象類中的抽象方法被繼承,需要override重寫 .
4.介面更像是一種規範,一種約束。
5.乙個子類只能繼承乙個抽象類,但卻可以繼承多個介面。
接下來是抽象方法 和虛方法 的異同:
其實可以把抽象方法看做是沒有方法體的虛方法。
相同點:
1.抽象方法和虛方法都可以被重寫。
不同點:
1.abstract 和virtual的關鍵字不同
2.抽象方法一定沒有方法體,而虛方法可以有方法體。
下面寫個例子說明一下:
view plaincopy to clipboardprint?
///
/// 乙個手機的抽象類
///
public abstract class mobilephone
set
}
public abstract void call();
public virtual void callagain()
}
///
/// 定義乙個實體類,繼承了乙個抽象類及多個介面
///
public class nokia :mobilephone,iclock,ilistenmusic
public void clock()
public void listenmusic()
public override void callagain()
}
///
/// 下面定義了兩個介面,為了說明可以繼承多個介面
///
public inte***ce ilistenmusic
public inte***ce iclock
再補充乙個小例子,
這裡有到很有意思的面試題,說名了new關鍵字和override的區別:
view plaincopy to clipboardprint?
class program
}
public class a5
public virtual void methodb()
}
public class b5 :a5
}
最後的答案是:"a5.methoda"
示例說明:
new是覆蓋override是過載。
「覆蓋」並不意味著「刪除」
示例
using system;
class a
}
class b: a
}
class test
}
輸出為
b.f
a.f
但「過載」意味著「刪除」,這就是「覆蓋」和「過載」的區別。
示例
using system;
class a
}
class b: a
}
class test
}
輸出為
b.f
b.f
介面 抽象類 抽象方法 虛方法 的區別
首先說一下介面 與抽象類 的異同 相同點 1.他們都不能例項化自己,也就是說都是用來被繼承的。2.抽象類中的抽象方法和介面方法一樣,都不能有方法體 不同點 1.抽象類裡可以有欄位,介面中也可以有欄位.2.抽象類中的普通方法可以有方法體,而介面方法沒有方法體。3.介面中的方法不能有訪問修飾符,抽象類中...
虛方法,抽象類 ,介面
抽象類不能被例項化 只能宣告方法,不能實現,只能有他的 是乙個隱式的虛方法 抽象類裡的方法不能是私有的 如果抽象是私有的,那麼他的子類訪問不了它 在抽象方法中使用static和virtual修飾符是錯誤的 在靜態屬性中使用abstract是錯誤的 abstract方法只能在抽象類中宣告 而virtu...
抽象方法 抽象類 介面 介面和抽象類的區別
某個父類只知道子類因該包含什麼樣的方法,無法知道這些子類如何實現這些方法。抽象類包含該方法但沒有對該方法的具體實現。有抽象方法的類只能被定義為抽象類,抽象類裡可以沒有抽象方法。抽象方法和抽象類的規則 public abstract class shape private string color p...