探讨继承与实现(二)
生活随笔
收集整理的這篇文章主要介紹了
探讨继承与实现(二)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前文 探討繼承與實現(一)? 根據雙魚座的提示已經更新。很不巧,我也是雙魚座的。由于水平有限,有什么不足還請大家指教。
2007年2月1日
http://www.cnblogs.com/birdshover/
目錄:
一、抽象的產生
二、依賴抽象
三、抽象的損耗
一、抽象的產生
你不知道你要實現的是個什么東西,你能很好的抽象出來么?我不是天才,所以我是不能。如果是那些天才至少也要是白癡天才型的人才能在毫無根據的情況下,假設出真是的存在。爾后居然被偉人證實居然是真的。比如說那個什么××××猜想。
我認為,抽象要么是在建立模型后的產物,要么是重構的結果。而抽象是為了解決程序未來面臨的變動。但是你即便把實體抽象出來了,不使用也是沒有效果的。而前人總結出經驗如何使用這些抽象產物——依賴倒置(Dependence Inversion Principle)。講的是:要依賴于抽象,不要依賴于具體。也就是經常說的面向接口編程。(這地方的接口是廣義上的接口)
假設公司裝了一扇自動門,有人來會開,人走了就關上。
?1?????public?class?Door
?2?????{
?3?????????private?bool?HavaPeson?=?false;???//是否有人,默認沒有。自動門,該狀態會自動改變。
?4?
?5?????????public?void?Open()
?6?????????{
?7?????????????if?(HavaPeson)
?8?????????????????Console.WriteLine("Opend");
?9?????????}
10?
11?????????public?void?Close()
12?????????{
13?????????????if?(!HavaPeson)
14?????????????????Console.WriteLine("Closed");
15?????????}
16?????}
我們把它抽象出來
1?????interface?IDoor
2?????{
3?????????void?Close();
4?????????void?Open();
5?????}
?1?????public?class?Door?:?IDoor
?2?????{
?3?????????private?bool?HavaPeson?=?false;
?4?
?5?????????public?void?Open()
?6?????????{
?7?????????????if?(HavaPeson)
?8?????????????????Console.WriteLine("Opend");
?9?????????}
10?
11?????????public?void?Close()
12?????????{
13?????????????if?(!HavaPeson)
14?????????????????Console.WriteLine("Closed");
15?????????}
16?????}
但是這對我們好像并沒有用。
這個時候公司又要裝一扇門,手推才會開,不推自動關上。
二、依賴抽象
?1?????public?class?Door2
?2?????{
?3?????????private?bool?IsPush?=?false;
?4?
?5?????????public?void?Open()
?6?????????{
?7?????????????if?(IsPush)
?8?????????????????Console.WriteLine("Opend");
?9?????????}
10?
11?????????public?void?Close()
12?????????{
13?????????????if?(!IsPush)
14?????????????????Console.WriteLine("Closed");
15?????????}
16?????}
Door2也實現了IDoor接口啊!
所以改成
public class Door2 : IDoor
{}
老總感覺這兩扇門不錯,所以要全大樓裝上這樣的門,并且采用電腦控制。
如果每個門一個控制端,那累也累死了。所以可以實現如下。
?1?????public?class?ContorlDoor
?2?????{
?3?????????private?IDoor[]?door?=?new?IDoor[100];
?4?????????private?bool?flag?=?false;??????//判斷門和人的關系狀態
?5?
?6?????????public?void?CDoor(int?i)
?7?????????{
?8?????????????door[i]?=?(IDoor)new?Door();
?9?????????????Contorl(door[i]);
10?????????}
11?
12?????????public?void?CDoor2(int?i)
13?????????{
14?????????????door[i]?=?(IDoor)new?Door2();
15?????????????Contorl(door[i]);
16?????????}
17?
18?????????public?void?Contorl(IDoor?d)
19?????????{
20?????????????if?(flag)
21?????????????????d.Open();
22?????????????else
23?????????????????d.Close();
24?????????}
25?????}
現在即使要加新的門,只要讓新型號的門實現接口IDoor就可以了。當然,這地方使用接口而不是抽象類,是根據第一篇文章決定的。探討繼承與實現(一)?
至于使用抽象類也是一樣的道理。
三、抽象的損耗
所謂有所得必有所失,靈活的架構必然會帶來性能上的損耗。
損耗的第一點,大家應該都看出來了,就是類型轉換。需要把類的實例轉換成接口或者抽象類。而轉換除了帶來靈活以外,并沒有其它的收獲。
?1??public?class?Test?:?ITest
?2?????{
?3?
?4?????????#region?ITest?成員
?5?????????private?int?myint;
?6?????????private?string?s;
?7?
?8?????????public?string?otherStr
?9?????????{
10?????????????get
11?????????????{
12?????????????????return?s;
13?????????????}
14?
15?????????????set
16?????????????{
17?????????????????s?=?value;
18?????????????}
19?????????}
20?
21?
22?
23?????????public?int?MyInt
24?????????{
25?????????????get
26?????????????{
27?????????????????return?myint;
28?????????????}
29?????????????set
30?????????????{
31?????????????????myint?=?value;
32?????????????}
33?????????}
34?
35?????????public?string?MyStr()
36?????????{
37?????????????return?"myStr";
38?????????}
39?
40?????????#endregion
41?
42?????????public?string?OtherStr()
43?????????{
44?????????????return?otherStr;
45?????????}
46?????} ?1?????public?interface?ITest
?2?????{
?3?????????int?MyInt
?4?????????{
?5?????????????get;
?6?????????????set;
?7?????????}
?8?
?9?????????string?otherStr?{?get;set;}
10?????????string?MyStr();
11?????} 1?????????static?void?Main(string[]?args)
2?????????{
3?????????????ITest?it?=?(ITest)new?Test();
4?????????????Test?t?=?(Test)it;
5?????????????t.otherStr?=?"1";
6?????????????it.otherStr?=?"2";
7?????????????Console.WriteLine(t.OtherStr());
8?????????????Console.ReadKey();
9?????????}以上代碼輸出值 2
實例it不能使用方法OtherStr,而再轉化回來后還能使用,證明內存種存在的是Test的實例。并沒有因為ITest?沒有OtherStr而砍掉。只是再it實例中屏蔽(簡化)了我們的訪問。
從圖中可以看出,轉換只是給了我們一個望遠鏡,一面能看到很大的視野,一面看到的小。就和古人寫的管中窺豹是一個道理吧。
而為什么輸出的是2而不是1,那是因為類是引用類型。而轉換后還是引用類型。it和t看似兩個實例,實際上指向的是同一段內存地址,只是留給你的看臺不一樣。
2007年2月1日
http://www.cnblogs.com/birdshover/
目錄:
一、抽象的產生
二、依賴抽象
三、抽象的損耗
一、抽象的產生
你不知道你要實現的是個什么東西,你能很好的抽象出來么?我不是天才,所以我是不能。如果是那些天才至少也要是白癡天才型的人才能在毫無根據的情況下,假設出真是的存在。爾后居然被偉人證實居然是真的。比如說那個什么××××猜想。
我認為,抽象要么是在建立模型后的產物,要么是重構的結果。而抽象是為了解決程序未來面臨的變動。但是你即便把實體抽象出來了,不使用也是沒有效果的。而前人總結出經驗如何使用這些抽象產物——依賴倒置(Dependence Inversion Principle)。講的是:要依賴于抽象,不要依賴于具體。也就是經常說的面向接口編程。(這地方的接口是廣義上的接口)
圖2.1 抽象的產生與運用
假設公司裝了一扇自動門,有人來會開,人走了就關上。
?1?????public?class?Door
?2?????{
?3?????????private?bool?HavaPeson?=?false;???//是否有人,默認沒有。自動門,該狀態會自動改變。
?4?
?5?????????public?void?Open()
?6?????????{
?7?????????????if?(HavaPeson)
?8?????????????????Console.WriteLine("Opend");
?9?????????}
10?
11?????????public?void?Close()
12?????????{
13?????????????if?(!HavaPeson)
14?????????????????Console.WriteLine("Closed");
15?????????}
16?????}
我們把它抽象出來
1?????interface?IDoor
2?????{
3?????????void?Close();
4?????????void?Open();
5?????}
?1?????public?class?Door?:?IDoor
?2?????{
?3?????????private?bool?HavaPeson?=?false;
?4?
?5?????????public?void?Open()
?6?????????{
?7?????????????if?(HavaPeson)
?8?????????????????Console.WriteLine("Opend");
?9?????????}
10?
11?????????public?void?Close()
12?????????{
13?????????????if?(!HavaPeson)
14?????????????????Console.WriteLine("Closed");
15?????????}
16?????}
但是這對我們好像并沒有用。
這個時候公司又要裝一扇門,手推才會開,不推自動關上。
二、依賴抽象
?1?????public?class?Door2
?2?????{
?3?????????private?bool?IsPush?=?false;
?4?
?5?????????public?void?Open()
?6?????????{
?7?????????????if?(IsPush)
?8?????????????????Console.WriteLine("Opend");
?9?????????}
10?
11?????????public?void?Close()
12?????????{
13?????????????if?(!IsPush)
14?????????????????Console.WriteLine("Closed");
15?????????}
16?????}
Door2也實現了IDoor接口啊!
所以改成
public class Door2 : IDoor
{}
老總感覺這兩扇門不錯,所以要全大樓裝上這樣的門,并且采用電腦控制。
如果每個門一個控制端,那累也累死了。所以可以實現如下。
圖2.2 抽象關系
?1?????public?class?ContorlDoor
?2?????{
?3?????????private?IDoor[]?door?=?new?IDoor[100];
?4?????????private?bool?flag?=?false;??????//判斷門和人的關系狀態
?5?
?6?????????public?void?CDoor(int?i)
?7?????????{
?8?????????????door[i]?=?(IDoor)new?Door();
?9?????????????Contorl(door[i]);
10?????????}
11?
12?????????public?void?CDoor2(int?i)
13?????????{
14?????????????door[i]?=?(IDoor)new?Door2();
15?????????????Contorl(door[i]);
16?????????}
17?
18?????????public?void?Contorl(IDoor?d)
19?????????{
20?????????????if?(flag)
21?????????????????d.Open();
22?????????????else
23?????????????????d.Close();
24?????????}
25?????}
現在即使要加新的門,只要讓新型號的門實現接口IDoor就可以了。當然,這地方使用接口而不是抽象類,是根據第一篇文章決定的。探討繼承與實現(一)?
至于使用抽象類也是一樣的道理。
三、抽象的損耗
所謂有所得必有所失,靈活的架構必然會帶來性能上的損耗。
損耗的第一點,大家應該都看出來了,就是類型轉換。需要把類的實例轉換成接口或者抽象類。而轉換除了帶來靈活以外,并沒有其它的收獲。
?1??public?class?Test?:?ITest
?2?????{
?3?
?4?????????#region?ITest?成員
?5?????????private?int?myint;
?6?????????private?string?s;
?7?
?8?????????public?string?otherStr
?9?????????{
10?????????????get
11?????????????{
12?????????????????return?s;
13?????????????}
14?
15?????????????set
16?????????????{
17?????????????????s?=?value;
18?????????????}
19?????????}
20?
21?
22?
23?????????public?int?MyInt
24?????????{
25?????????????get
26?????????????{
27?????????????????return?myint;
28?????????????}
29?????????????set
30?????????????{
31?????????????????myint?=?value;
32?????????????}
33?????????}
34?
35?????????public?string?MyStr()
36?????????{
37?????????????return?"myStr";
38?????????}
39?
40?????????#endregion
41?
42?????????public?string?OtherStr()
43?????????{
44?????????????return?otherStr;
45?????????}
46?????} ?1?????public?interface?ITest
?2?????{
?3?????????int?MyInt
?4?????????{
?5?????????????get;
?6?????????????set;
?7?????????}
?8?
?9?????????string?otherStr?{?get;set;}
10?????????string?MyStr();
11?????} 1?????????static?void?Main(string[]?args)
2?????????{
3?????????????ITest?it?=?(ITest)new?Test();
4?????????????Test?t?=?(Test)it;
5?????????????t.otherStr?=?"1";
6?????????????it.otherStr?=?"2";
7?????????????Console.WriteLine(t.OtherStr());
8?????????????Console.ReadKey();
9?????????}以上代碼輸出值 2
實例it不能使用方法OtherStr,而再轉化回來后還能使用,證明內存種存在的是Test的實例。并沒有因為ITest?沒有OtherStr而砍掉。只是再it實例中屏蔽(簡化)了我們的訪問。
圖2.3 類的轉換前后
從圖中可以看出,轉換只是給了我們一個望遠鏡,一面能看到很大的視野,一面看到的小。就和古人寫的管中窺豹是一個道理吧。
而為什么輸出的是2而不是1,那是因為類是引用類型。而轉換后還是引用類型。it和t看似兩個實例,實際上指向的是同一段內存地址,只是留給你的看臺不一樣。
總結
以上是生活随笔為你收集整理的探讨继承与实现(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分别用 数组和链表处理约瑟夫环问题
- 下一篇: python xml转换键值对_Pyth