1.首先來看一看抽象類 這裡定義了一個抽象類和兩個抽象方法,之後我們在定義子類去繼承它 這裡定義了一個cat類去繼承Animal,如果不實現的話,就會報如下的錯誤 這裡vs開發工具就會提示我們實現抽象類,vs可以自動幫我們去實現,然後去寫自己的代碼就可以了,然後就是調用 因為cat類繼承了Anima ...
1.首先來看一看抽象類
抽象類是特殊的類,不能夠被實例化;具有類的其他特性;抽象方法只能聲明於抽象類中,且不包含任何實現 (就是不能有方法體),派生類也就是子類必須對其進行重寫。
另外,抽象類可以派生自一個抽象類,可以覆蓋基類的抽象方法也可以不覆蓋,如果不覆蓋,則其派生類必須覆蓋它們。
關鍵字就是 abstract
/* * 抽象方法必須寫在,抽象類中 * */ public abstract class Animal {
public abstract void Sleep(); public abstract void Eat(); }
這裡定義了一個抽象類和兩個抽象方法,之後我們在定義子類去繼承它
/* *抽象類必須被重寫 */ public class cat : Animal { public override void Eat() { Console.WriteLine("我是cat,重寫了Eat"); } public override void Sleep() { Console.WriteLine("我是cat,重寫了Sleep"); } }
這裡定義了一個cat類去繼承Animal,如果不實現的話,就會報如下的錯誤
這裡vs開發工具就會提示我們實現抽象類,vs可以自動幫我們去實現,然後去寫自己的代碼就可以了,然後就是調用
Animal an = new cat(); an.Eat(); an.Sleep();
因為cat類繼承了Animal並重寫了裡面的方法,所以我們可以直接替換Animal讓cat代替出現,抽象類同樣也可以定義自己的方法,例如:
public abstract class Animal { public void show() { Console.WriteLine("我是抽象類自己的方法"); } public abstract void Sleep(); public abstract void Eat(); }
2.我們再來看一看虛方法
virtual關鍵字用於修飾方法
/* * 虛方法,必須有方法體 */ public class people { public virtual void Sleep() { } public virtual void Eat() { } }
定義虛方法必須要有方法體,然後定義子類去繼承people
/* * 虛方法可以不被重寫 */ public class student:people { public override void Sleep() { Console.WriteLine("我是student,"); } }
如果說只是繼承了people這個類而沒有去重寫它的方法,這樣的情況是不會報錯的,我在這裡只是重寫了people的Sleep方法,override後面加返回值類型 基類的方法名
然後就是調用
people op = new student(); op.Sleep();
3.然後就是介面
介面中的所有方法都是抽象的,沒有一個有程式體。介面只可以定義static final成員變數
/* * 介面中的成員是隱式公有的,不能加修飾符 */ public interface ImyInterface { int aa { get; set; } void test(); }
然後我們去定義子類,實現介面
public class overInterface : ImyInterface { public int aa { get; set; } public void test() { Console.WriteLine("我實現了介面,"); } }
如果不實現介面,就會報以下錯誤
然後就是調用
ImyInterface ter = new overInterface(); ter.aa = 45; ter.test(); Console.WriteLine(ter.aa);
那麼我們來總結一下
抽象方法:
1.必須定義在抽象類中,
2.不能夠被實例化
3.子類必須對其進行重寫
4.定義抽象方法時不能夠有方法體 { } 都不能有
5:關鍵字 abstract
虛方法:
1:可以不被重寫
2:定義方法時能夠有自己的方法體
3:關鍵字:virtual
介面:
1:定義時不能加訪問修飾符,也不能有方法體
2:它的子類必須實現所有方法,與抽象類相似
3:關鍵字:interface
那麼這裡有一個問題:
介面是否可繼承介面? 抽象類是否可實現(implements)介面? 抽象類是否可繼承實體類(concrete class)?
答案:
介面可以繼承介面。抽象類可以實現(implements)介面,抽象類是否可繼承實體類,但前提是實體類必須有明確的構造函數。