系列文章
[UML]UML系列——用例圖中的各種關系(include、extend)
[UML]UML系列——類圖class的關聯關系(聚合、組合)
泛化關系的引入
在現實生活中,有時會出現一類事物具有另一類事物的全部特點,除此之外還有自身的特點。
例如:
“不管白貓黑貓,捉到老鼠的就是好貓。”
泛化關系的概念與符號(Generalization)
如果一個類A(父類)的屬性和操作能被另一個類B(子類)所繼承,則類B不僅可以包含類A中的屬性和操作,而且還可以添加自己獨有的屬性和操作,這種機制就是泛化。泛化也稱之為繼承或派生。
泛化關系在程序中的體現

1 class student 2 { 3 public int number; 4 public string name; 5 public string myclass; 6 }

1 class graduate:student 2 { 3 public string research; 4 public string teacher; 5 }
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 graduate g1 = new graduate(); 6 g1.number = 1000; 7 g1.name = "張三"; 8 g1.myclass = "火鳳凰"; 9 g1.research = "男人和女人到底有什么區別"; 10 g1.teacher = "雷神"; 11 Console.WriteLine("姓名:"+g1.name); 12 Console.WriteLine("導師:"+g1.teacher); 13 }
可見性的分析
(在程序中的演示,這里就不說了,都是子類繼承父類,很基礎的東西)
泛化關系的應用——多態
多態性:在泛化關系中,父類所定義的操作被子類繼承之后,可以表現出不同的行為。
多態性允許在(有繼承關系的)多個類中定義同名的操作,並在每一個類中有不同的實現。
c#中的多態機制:
父類中:可見性 virual返回值類型 方法名(參數)
子類中:可見性 override 返回值類型 方法嗎(參數)
程序演示:各國不同的問候方式
1 public class TMan //定義一個普通人類 2 { 3 public string name; 4 public virtual void sayHello() 5 { 6 Console.WriteLine(name+"說漢語"); 7 } 8 }
1 public class TChinese : TMan //定義中國人類 2 { 3 public TChinese(string x) 4 { 5 name = x; 6 } 7 8 public override void sayHello() 9 { 10 base.sayHello(); 11 //Console.WriteLine(name+"中國人還會說英語"); 12 } 13 }
1 public class TAmerican : TMan //定義美國人類 2 { 3 public TAmerican(string x) 4 { 5 name = x; 6 } 7 8 public override void sayHello() 9 { 10 Console.WriteLine(name+"美國人說英語"); 11 12 } 13 }

1 public class TFrench : TMan //定義法國人類 2 { 3 public TFrench(string x) 4 { 5 name = x; 6 } 7 8 public override void sayHello() 9 { 10 Console.WriteLine(name+"法國人說法語"); 11 } 12 }

1 public class TKorean : TMan //定義韓國人類 2 { 3 public TKorean(string x) 4 { 5 name = x; 6 } 7 8 public override void sayHello() 9 { 10 Console.WriteLine(name+"韓國人說韓語"); 11 } 12 }
1 class Program 2 { 3 static void Main(string[ ] args) 4 { 5 TMan x; 6 7 x = new TChinese("張三"); 8 x.sayHello(); 9 10 x = new TAmerican("John"); 11 x.sayHello(); 12 13 x = new TFrench("蘇非"); 14 x.sayHello(); 15 16 x = new TKorean("金知中"); 17 x.sayHello(); 18 } 19 }
(代碼中有省略,只是來說明問題)
多態的實現機制
子類覆蓋父類同名的方法。
當一個類被繼承時,他的方法也就被其子類繼承。這種繼承可以是無條件的繼承全部舊方法,也可以重新編寫新方法來覆蓋舊方法。
多態就是指不同對象收到相同消息時,會產生不同行為,同一個類在不同的場合下表現出不同的行為特征
多態的作用:把不同的子類對象都當作父類來看,可以屏蔽不同子類對象之間的差異,寫出通用的代碼,做出通用的編程,以適應需求的不斷變化。
總結
泛化關系還是比較容易理解的,泛化可能不知道,但是繼承,作為程序員不可能不知道。