close
virtual 虛擬方法,若希望或預料到基礎類別的這個方法在將來的衍生類別中會被覆寫(override),
則此方法必須被聲明為 virtual。
1 class Employee 2 { 3 protected int m_salary; 4 public virtual int Salary 5 { 6 get 7 { 8 return m_salary; 9 } 10 set 11 { 12 if (value >= 22000 & value <= 42000) 13 { 14 m_salary = value; 15 } 16 else 17 { 18 if (value < 22000) 19 m_salary = 22000; 20 else 21 m_salary = 42000; 22 } 23 } 24 } 25 public void showTotal() 26 { 27 Console.WriteLine("實領薪水{0}", m_salary); 28 } 29 }
Operator薪水繼承Employee, 基本上薪水上下限的規則不變(與父類別相同)
1 class Operator : Employee 2 { 3 public override int Salary 4 { 5 get 6 { 7 return base.Salary; 8 } 9 set 10 { 11 if (value >= 22000 & value <= 42000) 12 { 13 m_salary = value; 14 } 15 else 16 { 17 if (value < 22000) 18 m_salary = 22000; 19 else 20 m_salary = 42000; 21 } 22 } 23 } 24 }
1 class Operator : Employee 2 { 3 public override int Salary 4 { 5 get 6 { 7 return base.Salary; 8 } 9 set 10 { 11 base.Salary = value; 12 } 13 } 14 }
Manager薪水繼承Employee, 但薪水上下限會覆寫以及多了紅利
1 class Manager : Employee 2 { 3 public int Bonus { get; set; } 4 public override int Salary 5 { 6 get 7 { 8 return base.Salary; 9 } 10 set 11 { 12 if( (value >= 30000) && (value <=60000)) 13 { 14 m_salary = value; 15 }else 16 { 17 if (value < 30000) 18 { 19 m_salary = 30000; 20 } 21 else 22 { 23 m_salary = 60000; 24 } 25 } 26 } 27 } 28 public void showTotal() 29 { 30 Console.WriteLine("實領薪水{0}", Bonus + Salary); 31 } 32 }
測試
1 static void Main(string[] args) 2 { 3 Manager Ryan = new Manager(); 4 Ryan.Salary = 70000; // upper bound is 60000 5 Ryan.Bonus = 30000; 6 Console.WriteLine("Ryan's salary: "); 7 Ryan.showTotal(); 8 9 Operator Peter = new Operator(); 10 Peter.Salary = 18000; 11 Console.WriteLine("Peter's salary: "); 12 Peter.showTotal(); 13 Console.Read(); 14 }
====================================================================
abstract 抽象方法,是空的方法,沒有方法實體,衍生類必須以override 實現此方法。
1 public abstract class Employee 2 { 3 protected int m_salary; 4 public abstract int getSalary(); 5 public abstract void setSalary(int value); 6 public abstract void showTotal(); 7 }
Operator繼承Employee
1 public class Operator : Employee 2 { 3 public override int getSalary() 4 { 5 return m_salary; 6 } 7 public override void setSalary(int value) 8 { 9 if (value >= 22000 & value <= 42000) 10 { 11 m_salary = value; 12 } 13 else 14 { 15 if (value < 22000) 16 m_salary = 22000; 17 else 18 m_salary = 42000; 19 } 20 } 21 public override void showTotal() 22 { 23 Console.WriteLine("實領薪水{0}", m_salary); 24 } 25 }
Manager薪水繼承Employee, 但薪水上下限會覆寫以及多了紅利(Bonus)
1 public class Manager : Employee 2 { 3 public int Bonus { get; set; } 4 public override int getSalary() 5 { 6 return m_salary; 7 } 8 public override void setSalary(int value) 9 { 10 if (value >= 30000 & value <= 60000) 11 { 12 m_salary = value; 13 } 14 else 15 { 16 if (value < 30000) 17 m_salary = 30000; 18 else 19 m_salary = 60000; 20 } 21 } 22 public override void showTotal() 23 { 24 Console.WriteLine("實領薪水{0}", m_salary+Bonus); 25 } 26 }
測試
1 static void Main(string[] args) 2 { 3 Manager Ryan = new Manager(); 4 Ryan.setSalary(70000); 5 Ryan.Bonus = 30000; 6 Console.WriteLine("Ryan's salary: "); 7 Ryan.showTotal(); 8 9 Operator Peter = new Operator(); 10 Peter.setSalary(18000); 11 Console.WriteLine("Peter's salary: "); 12 Peter.showTotal(); 13 Console.Read(); 14 }
abstract 和 virtual 的區別:
abstract 方法還沒實現,virtual 則比較好,衍生類別想覆寫就覆寫,不想覆寫就用父類別定義。
參考資料:
全站熱搜