(最近帶一個新手入門 講這邊老費力了。)
接口和抽象類不過都是類的抽象罷了,這是他們的本質,只不過人們的思維角度不同而已,一個偏向為行為契約上的抽象(接口) 一個更像大自然中的繁衍關系(抽象類)。
直接上代碼:
class 抽象類 { public static void Main(string[] args) { ChinesePerson c = new ChinesePerson("xx", 23); c.Run(); c.Speak(); Console.WriteLine(c.Name); Console.WriteLine(c.Age); Console.WriteLine(c.Hobby); Console.WriteLine("--------"); c.fight(); JiangSuPerson j = new JiangSuPerson(); j.Name = "xiaomao"; j.Age = 24; j.Run(); j.Speak(); j.fight(); j.sing(); Console.WriteLine(j.Name); Console.WriteLine(j.Age); Console.WriteLine(j.Hobby); Console.WriteLine("----------"); HenanPerson h = new HenanPerson(); h.Name = "linyi"; h.Speak(); h.fight(); h.sing(); Console.ReadKey(); } } public interface IRun { void Run(); } public abstract class Person : IRun { PRivate string name; private int age; public string Name { get { return name; } set { name = value; } } public int Age { get { return age; } set { age = value; } } public abstract string Hobby { get; set; } public Person(string name, int age) { this.Name = name; this.Age = age; } public Person() { } public abstract void Speak(); public void Run() { Console.WriteLine("Running ~~"); } //能夠被子類重寫的 只有 abstract 或virtual修飾的, //不同在于,abstract一定要被重寫,而virtual則是可以被重寫 但不一定非要重寫,還有就是virtual要有方法體。 public virtual void fight() { Console.WriteLine("fighting"); } } public class ChinesePerson : Person { public ChinesePerson(string name, int age) : base(name, age) { this.Name = name; this.Age = age; } public ChinesePerson() { } public override void Speak() { Console.WriteLine("中國人說中文"); } public override string Hobby { get { return "shopping"; } set { } } public override void fight() { base.fight(); Console.WriteLine("chinese gongfu fighting"); } public virtual void sing() { Console.WriteLine("用中文唱歌"); } } //繼承自中國人,但是沒有任何重寫 public class JiangSuPerson : ChinesePerson { } public class HenanPerson : ChinesePerson { public override void Speak() { Console.WriteLine("河南人說河南方言"); } public override void sing() { Console.WriteLine("用河南話唱歌"); } }總結一下:抽象類 和接口都是類的抽象,接口更關注從行為方面來抽象,而在語法上 接口的內容必須都是沒有實現的,完全等待后面的類來實現的而在這一點上,抽象類則像是一個沒有完全實現的類,他想所有普通類一樣,可以擁有字段,屬性,以及方法,這些都是可以有具體實現體的,但就這樣的話,他和普通類的差別只在于他不可以通過new實例化,而他的真正不同在于 他應該有abstract修飾的部分,這部分沒有具體實現,必須由由后面的實現類來具體實現。而virtual關鍵字本不該屬于這里的討論范疇,他修飾的方法和普通方法幾乎一樣,都是有著方法體的,但是被virtual修飾的可以被子類重寫。
再舉個例子模擬下mvc的控制器模塊
//大致模擬了MVC框架中的控制器模塊的思想 class 抽象類二 { public static void Main(string[] args) { IController ic; ic = new HomeController(); ic.Execute(); Console.ReadKey(); } } public interface IController { void Execute(); } public abstract class ControllerBase : IController { //可以選擇性的重寫這整個方法,而不按照所期望的分步驟 public virtual void Execute() { Console.WriteLine("doing some unimporting things"); ExecuteCore(); } //這個方法則必須實現 public abstract void ExecuteCore(); } public abstract class Controller : ControllerBase { public override void ExecuteCore() { Console.WriteLine("doing some importing things"); } //public override void Execute() //{ // Console.WriteLine("doing the whole things"); //} } public class HomeController : Controller { }新聞熱點
疑難解答