物件導向基礎(2)--抽象類 介面 集合 泛型
接上一篇講:
一.抽象類和介面:
1.抽象類:
我們觀察發現,Animal類其實根本就不可能例項化,動物是一個抽象名詞,沒有具體物件與之對應,可以把例項化沒有意義的類改成抽象類,同樣getShoutSound函式也沒有 任 何意義,可以將virtual修飾符修改為abstract,使之成為抽象方法
abstract class Animal
{
……
protected abstract string getShoutSound();
}
*注意:
第一,抽象類不能例項化
比如動物例項沒有實際意義
第二,抽象方法必須是被子類重寫的方法
不重寫的話,也沒有存在意義,看作沒有實現體的虛方法
第三,如果類中包含抽象方法,那麼類必須定義為抽象類,無論是否包含一些其它方法
好了,我們想一下,竟然抽象類的抽象方法需要子類實現,那麼出現下面的這種情況的話就會出現問題了........
這樣的話要是在父類Animal定義抽象方法的話,猴,豬等都要去實現它,但是他們並沒有這種方法,因此引入介面。。
2.介面.
介面(interface)是把隱式公共方法和屬性組合起來,以封裝特定功能的一個集合。一旦類實現了介面,類就可以支援介面所指定的所有屬性和成員。宣告介面在語法上與 宣告抽象類完全相同,但不允許提供介面中任何成員的執行方式。
一個類可以支援多個介面,多個類也可以支援同一個介面。
interface IChange
{
string ChangeThing(string thing);//不能有方法體和修辭符
}
例如:哆啦A夢類的實現:
class MachineCat:Cat, IChange//實現類和介面
{
public MachineCat() : base()
{
}
public MachineCat(string name): base(name)
{
}
public string ChangeThing(string thing)
{
return base.Shout() + " 我有萬能的口袋,我可變出" + thing;
}
}
3.抽象類和介面的區別:
抽象類可以給出一些成員的實現,介面卻不包含成員的實現,抽象類的抽象成員可被子類部分實現,介面的成員需要實現類完全實現,一個類只能繼承一個抽象類,但可實現多個介面等。
第一,類是物件的抽象,抽象類是對類的抽象;介面是對行為的抽象。
第二,如果行為跨越不同類的物件,可使用介面;對一些相似的類物件,用繼承抽象類。
第三,從設計的角度講,抽象類是從子類中發現了公共的東西,泛化出了父類,然後子類繼承父類,而介面是根本不知子類的存在,方法如何實現還不確認,是預先定義的
二.集合和泛型
1.集合:
來用例子說明:
ArrayList實現了IList介面,所以可以用ArrayList的例項來賦值給IList(類似於多型),使用Arraylist裡面的方法
IList AnimalList = new ArrayList();
AnimalList.Add(new Cat("小花"));
AnimalList.Add(new Dog("阿毛"));
AnimalList.Add(new Cat("小黑"));
AnimalList.Add(new Dog("嬌嬌"));
AnimalList.Add(new Dog("咪咪"));
AnimalList.Insert(1,new Cat("哆啦A夢"));
foreach (Animal item in AnimalList)//這裡的AnimalList裡面的每一項都是Animal的子類,所以可以採用多型的形式來使用
{
MessageBox.Show(item.Shout());
}
泛型是具有佔位符(型別引數)的類、結構、介面和方法,在IList和List後面加<T>,這個T就是集合資料的資料型別。
private void button6_Click(object sender, EventArgs e)
{
IList<Animal> AnimalList = new List<Animal>();
AnimalList.Add(new Cat("小花"));
AnimalList.Add(new Dog("阿毛"));
AnimalList.Add("Hello World");
foreach (Animal item in AnimalList)
{
MessageBox.Show(item.Shout());
}
}
這樣寫的話程式會報錯,因為"Helllo world"不是一個Animal的派生物件,需要這樣改進。。。
IList<Animal> AnimalList = new List<Animal>();
AnimalList.Add(new Cat("小花"));
AnimalList.Add(new Dog("阿毛"));
AnimalList.Add("Hello World");
foreach (Animal item in AnimalList)
{
MessageBox.Show(item.Shout());
}
這樣以來,"Helllo world"就是一個Animal的派生物件,可以對這個集合進行操作了。。。。。。
OK,整了兩個多小時,終於整理完了,期待下節課!!!!
相關文章
- 物件導向-抽象類物件抽象
- [.net 物件導向程式設計基礎] (15) 抽象類物件程式設計抽象
- [.net 物件導向程式設計基礎] (18) 泛型物件程式設計泛型
- JAVA物件導向--抽象類Java物件抽象
- 物件導向 -- 三大特性之繼承 補充 抽象類 介面類物件繼承抽象
- 物件導向基礎物件
- Java第八課. 物件導向特徵3-多型&抽象類Java物件特徵多型抽象
- 面向Python,物件導向(基礎2)Python物件
- JAVA(一)JAVA基礎/物件導向基礎/高階物件導向Java物件
- JAVA物件導向基礎--物件導向介紹Java物件
- Java基礎-抽象類和介面Java抽象
- Java基礎-物件導向基礎Java物件
- [.net 物件導向程式設計基礎] (16) 介面物件程式設計
- Java基礎之介面與抽象類及多型、內部類Java抽象多型
- [.net 物件導向程式設計基礎] (13) 物件導向三大特性——多型物件程式設計多型
- JAVA物件導向基礎Java物件
- PHP物件導向基礎PHP物件
- 【Java 基礎】——物件導向Java物件
- Java基礎 --- 物件導向Java物件
- JAVA物件導向基礎--N種內部類Java物件
- [.net 物件導向程式設計基礎] (2) 關於物件導向程式設計物件程式設計
- TypeScript 泛型介面和泛型類TypeScript泛型
- 物件導向基礎(1)--繼承 多型 重構物件繼承多型
- JAVA物件導向基礎--封裝 繼承 多型Java物件封裝繼承多型
- [.net 物件導向程式設計基礎] (17) 陣列與集合物件程式設計陣列
- PHP 物件導向基礎概念PHP物件
- java基礎二:物件導向Java物件
- python物件導向[基礎]Python物件
- 12 物件導向基礎-1物件
- Golang 基礎之物件導向Golang物件
- JAVA基礎之三-介面和抽象類Java抽象
- 物件導向-介面物件
- JavaSE第三章 物件導向 抽象類 abstractJava物件抽象
- Python 學習筆記之類「物件導向,超類,抽象」Python筆記物件抽象
- Python基礎(二十):物件導向“類”第三課——類成員Python物件
- 「MoreThanJava」Day 4:物件導向基礎Java物件
- 【Java基礎】物件導向開發Java物件
- 面向Python,物件導向(基礎)Python物件