淺談接口、抽象類(lèi)、抽象方法和虛方法的區(qū)別
C#抽象類(lèi)和接口孩子間在對(duì)于抽象類(lèi)定義的支持方面具有很大的相似性,甚至可以相互替換,因此很多開(kāi)發(fā)者在進(jìn)行抽象類(lèi)定義時(shí)對(duì)于抽象類(lèi)和接口的選擇顯得比較隨意。其實(shí),兩者之間還是有很大區(qū)別的。
首先說(shuō)一下接口與抽象類(lèi)的異同:
相同點(diǎn):
1.他們都不能實(shí)例化自己,也就是說(shuō)都是用來(lái)被繼承的。
2.抽象類(lèi)中的抽象方法和接口方法一樣,都不能有方法體
不同點(diǎn):
1.抽象類(lèi)里可以有字段,接口中不能有字段.
2.抽象類(lèi)中的普通方法可以有方法體,而接口方法沒(méi)有方法體。
3.接口中的方法不能有訪問(wèn)修飾符,抽象類(lèi)中的抽象方法被繼承,需要override重寫(xiě) .
4.接口更像是一種規(guī)范,一種約束。
5.一個(gè)子類(lèi)只能繼承一個(gè)抽象類(lèi),但卻可以繼承多個(gè)接口。
接下來(lái)是抽象方法和虛方法的異同:
其實(shí)可以把抽象方法看做是沒(méi)有方法體的虛方法。
相同點(diǎn):
1.抽象方法和虛方法都可以被重寫(xiě)。
不同點(diǎn):
1.abstract 和virtual的關(guān)鍵字不同
2.抽象方法一定沒(méi)有方法體,而虛方法可以有方法體。
下面寫(xiě)個(gè)例子說(shuō)明一下:
- /// <summary>
 - /// 一個(gè)手機(jī)的抽象類(lèi)
 - /// </summary>
 - public abstract class Mobilephone
 - {
 - private string _logo;
 - public string Logo
 - {
 - get { return _logo; }
 - set { _logo = value; }
 - }
 - public abstract void Call();
 - public virtual void Callagain()
 - {
 - Console.WriteLine("我再打一個(gè)電話");
 - }
 - }
 - /// <summary>
 - /// 定義一個(gè)實(shí)體類(lèi),繼承了一個(gè)抽象類(lèi)及多個(gè)接口
 - /// </summary>
 - public class Nokia :Mobilephone,IClock,Ilistenmusic
 - {
 - public override void Call()
 - {
 - Console.WriteLine("NOKIA打電話沒(méi)問(wèn)題");
 - }
 - public void clock()
 - {
 - Console.WriteLine("NOKIA的手機(jī)也有鬧鐘功能");
 - }
 - public void listenmusic()
 - {
 - Console.WriteLine("NOKIA的手機(jī)還能聽(tīng)歌");
 - }
 - public override void Callagain()
 - {
 - Console.WriteLine("算了,還是不打了");
 - }
 - }
 - /// <summary>
 - /// 下面定義了兩個(gè)接口,為了說(shuō)明可以繼承多個(gè)接口
 - /// </summary>
 - public interface Ilistenmusic
 - {
 - void listenmusic();
 - }
 - public interface IClock
 - {
 - void clock();
 - }
 
在補(bǔ)充一個(gè)小例子,
這里有到很有意思的面試題,說(shuō)名了new關(guān)鍵字和override的區(qū)別:
- class Program
 - {
 - static void Main(string[] args)
 - {
 - B5 b5 = new B5();
 - b5.MethodB();
 - }
 - }
 - public class A5
 - {
 - public virtual void MethodA()
 - {
 - Console.WriteLine("A5.MethodA");
 - Console.Read();
 - }
 - public virtual void MethodB()
 - {
 - MethodA();
 - }
 - }
 - public class B5 :A5
 - {
 - public new void MethodA()
 - {
 - Console.WriteLine("B5.MethodA");
 - Console.ReadLine();
 - }
 - }
 - class Program
 - {
 - static void Main(string[] args)
 - {
 - B5 b5 = new B5();
 - b5.MethodB();
 - }
 - }
 - public class A5
 - {
 - public virtual void MethodA()
 - {
 - Console.WriteLine("A5.MethodA");
 - Console.Read();
 - }
 - public virtual void MethodB()
 - {
 - MethodA();
 - }
 - }
 - public class B5 :A5
 - {
 - public new void MethodA()
 - {
 - Console.WriteLine("B5.MethodA");
 - Console.ReadLine();
 - }
 - }
 
***的答案是:"A5.MethodA"
【編輯推薦】















 
 
 

 
 
 
 