using System; using System.Collections.Generic; using System.Linq; using System.Text; //抽象類(abstract) //abstract 修飾符可以和類、方法、屬性、索引器及事件一起使用。在類聲明中使用abstract修飾符 //以指示某個類只能是其他類的基類。標記為抽象或包含在抽象類中的成員必須通過從抽象類派生的類來實現。 //抽象類的特性 //1、抽象類不能實例化。 //2、抽象類可以包含抽象方法和抽象訪問器。 //3、不能用 sealed 修飾符修改抽象類,這意味着抽象類不能被繼承。 //4、從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實現。 //抽象方法 //1、抽象方法是隱式的虛方法。 //2、只允許在抽象類使用抽象方法聲明。 //3、因為抽象方法聲明不提供實際的實現,所有沒有方法體;方法聲明只是以一個分號結束, //並且在簽名后沒有大括號,實現由一個重寫方法提供,此重寫方法是非抽象類的成員。 //4、在抽象方法聲明中使用static或virtual修飾符是錯誤的。 //5、除了在聲明和調用語法上不同外,抽象屬性的行為與抽象方法一樣。 //6、在靜態屬性上使用abstract修飾符是錯誤的。 //7、在派生類中,通過包括使用override修飾符的屬性聲明,可以重寫抽象的繼承屬性。 namespace 抽象類 { //定義一個抽象類 abstract class A { protected int _x; //private abstract void F(); //報錯!虛擬成員或抽象成員不能是私有的。 public abstract void F(); //聲明一個抽象方法,抽象方法必須定義在抽象類中,並且方法中不能包含主體。 public abstract int X { get; set; } //聲明一個抽象屬性 } class B : A { public override void F() //繼承抽象類,必須重寫抽象類中的抽象方法。 { throw new NotImplementedException(); } public override int X { get { return _x; } set { _x = value; } } } class Program { static void Main(string[] args) { //A a = new A(); //報錯!1、抽象類不能實例化。 B b = new B(); //可以實例化 b.X = 10; Console.WriteLine(b.X); Console.ReadKey(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 抽象類1 { //員工類 abstract class Employee { protected string _name; protected Employee() { } protected Employee(string name) { _name = name; } //抽象方法 public abstract void StartWork(); //如果實現共同操作使用虛方法,如果不知道實現操作使用抽象方法。 } //經理類 class Manager : Employee { //構造函數 public Manager(string name) : base(name) //賦值給基類(Employee)構造函數name { } //重寫虛方法 public override void StartWork() //使用虛方法實現面向對象的多態 { Console.WriteLine(_name + "給員工下達任務"); } } //秘書類 class Secretary : Employee { public Secretary(string name) : base(name) { } public override void StartWork() { Console.WriteLine(_name + "協助經理"); } } //銷售類 class Seller : Employee { public Seller(string name) : base(name) { } public override void StartWork() { Console.WriteLine(_name + "銷售產品"); } } //財務類 class Accountant : Employee { public Accountant(string name) : base(name) { } public override void StartWork() { Console.WriteLine(_name + "管理公司財政"); } } class Program { static void Main(string[] args) { Employee[] emp = new Employee[5]; emp[0] = new Manager("張三"); emp[1] = new Secretary("李四"); emp[2] = new Seller("王五"); emp[3] = new Seller("馬六"); emp[4] = new Accountant("錢七"); Console.WriteLine("早上8點,開始工作"); foreach (Employee e in emp) { e.StartWork(); } Console.ReadKey(); } } }