C#中類與接口的區(qū)別講解
一、抽象類
抽象類是特殊的類,只是不能被實例化;除此以外,具有類的其他特性;重要的是抽象類可以包括抽象方法,這是普通類所不能的。抽象方法只能聲明于抽象類中,且不包含任何實現(xiàn),派生類必須覆蓋它們。另外,抽象類可以派生自一個抽象類,可以覆蓋基類的抽象方法也可以不覆蓋,如果不覆蓋,則其派生類必須覆蓋它們。
注意:
1.抽象方法,必須存在于抽象類當中。相反,抽象類中不一定全部是抽象方法。
2.抽象方法沒有方法體,繼承了抽象類的子類,必須實現(xiàn)父類的所有的抽象方法。
3.抽象類可以被實例化,但不能通過普通的實例化new,它只能通過父類的應用指向子類的實例來間接的實例化子類。如:
Person t = new Teacher();
二、接口
接口是引用類型的,類似于類,接口內(nèi)包含的全部是未實現(xiàn)的方法,而且接口類和方法的關鍵詞不需要再聲明abstract。和抽象類的相似之處有三點:
1.不能實例化;
2.包含未實現(xiàn)的方法聲明;
3.派生類必須實現(xiàn)未實現(xiàn)的方法,抽象類是抽象方法,接口則是所有成員(不僅是方法包括其他成員);
另外,接口有如下特性:
接口除了可以包含方法之外,還可以包含屬性、索引器、事件,而且這些成員都被定義為公有的。
除此之外,不能包含任何其他的成員,例如:常量、域、構造函數(shù)、析構函數(shù)、靜態(tài)成員。一個類可以直接繼承多個接口,但只能直接繼承一個類(包括抽象類)。
三、抽象類和接口的相同點和不同點
不同點:接口不包含方法的實現(xiàn),抽象類可以包含,也可以不包含,不包含時非抽象方法時{}必須保留。
接口可以多繼承,類只能單繼承。
類定義可在不同的源文件之間進行拆分。
相同點:都不能進行實例化,必須通過繼承實現(xiàn)其抽象方法。
接口、類和結構都可以從多個接口繼承。
接口類似于抽象基類:繼承接口的任何非抽象類型都必須實現(xiàn)接口的所有成員。
接口和類都可以包含事件、索引器、方法和屬性。
四、代碼案例
抽象類:
namespace ClassDemo1
{
#region 類
public abstract class Person
{
//函數(shù)即使對象的動作
public void Breath()
{
//空方法體
}
public void Name()
{
Console.WriteLine("人人都有姓名!");
}
public virtual void Drink() // 注意virtual,表明這是一個虛擬函數(shù)
{
Console.WriteLine("人是要喝水的!");
}
public void Eat()
{
Console.WriteLine("人是要吃飯的!");
}
public void Sleep()
{
Console.WriteLine("人是要睡覺的!");
}
}
public class Teacher :Person
{
//重定義父類方法
public new void Eat()
{
Console.WriteLine("教師是人,也是要吃飯的!");
}
//重寫父類方法
public override void Drink()
{
Console.WriteLine("教師是人,也是要喝水的!");
}
//自己獨有方法(動作)
public void Teach()
{
Console.WriteLine("教師的義務是要進行教授課程!");
}
}
#endregion
//測試
class Program
{
static void Main(string[] args)
{
Teacher t = new Teacher();
t.Breath();
t.Name();
t.Drink();
t.Eat();
t.Sleep();
t.Teach();
Console.ReadKey();
}
}
}接口:
namespace InterfaceDemo1
{
#region 接口
//不能進行實例化,只能通過繼承實現(xiàn)其抽象方法
//還可以包含屬性、索引器、事件,而且這些成員都被定義為公有的。
//除此之外,不能包含任何其他的成員,例如:常量、域、構造函數(shù)、析構函數(shù)、靜態(tài)成員。
//定義學生接口
public interface IStudent
{
//未實現(xiàn)的方法聲明;
void study_base();
}
//定義職員接口
public interface IEmployee
{
void work();
}
//定義計算機類學生接口
public interface IIStudent : IStudent
{
void study_computer();
}
//接口能實現(xiàn)多繼承,子類必須實現(xiàn)繼承接口的所有方法
public class Infostudent : IEmployee, IIStudent
{
//實現(xiàn)學生接口
public void study_base()
{
Console.WriteLine("數(shù)學、語文和英語必須學好");
}
//實現(xiàn)職員接口
public void work()
{
Console.WriteLine("工作必須完成");
}
//實現(xiàn)計算機類學生接口
public void study_computer()
{
Console.WriteLine("計算機類的學生除學好基礎課外,還要學C#");
}
//自己定義的方法
public void play_game()
{
Console.WriteLine("計算機類的學生除學好基礎課外和學C#外,還喜歡打游戲");
}
}
#endregion
//測試
class Program
{
static void Main(string[] args)
{
//派生與接口的學生類
Infostudent infostudent = new Infostudent();
infostudent.study_base();
infostudent.work();
infostudent.study_computer();
//學生自己獨有的方法
infostudent.play_game();
Console.ReadKey();
}
}
}以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
PowerShell 定時執(zhí)行.Net(C#)程序的方法
利用PowerShell可以調(diào)用動態(tài)頁面,然后再用 .bat 執(zhí)行 PowerShell 腳本,最后把 .bat 添加到服務器的任務計劃里面。OK,所有操作都做好了,.Net 定時執(zhí)行了,是不是呢,有木有呢。2013-04-04
C# 委托的三種調(diào)用示例(同步調(diào)用 異步調(diào)用 異步回調(diào))
本文將主要通過同步調(diào)用、異步調(diào)用、異步回調(diào)三個示例來講解在用委托執(zhí)行同一個加法類的時候的的區(qū)別和利弊2013-12-12

