close

image

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 }

image

====================================================================

image

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 }


image

abstract 和 virtual 的區別:

abstract 方法還沒實現,virtual 則比較好,衍生類別想覆寫就覆寫,不想覆寫就用父類別定義。


參考資料:

arrow
arrow
    全站熱搜

    me1237guy 發表在 痞客邦 留言(0) 人氣()