C# 多態 多態定義 多態性:在程序中同一符號或名字在不同情況下具有不同的解釋。 多態性的多種基本形式: www.2cto.com 編譯時多態性:指在程序編譯階段即可確定的多態性 由重載機制實現:函數重載和運算符重載 運行時多態性:指必須等到程序動態運行時才可確定的多態性 由繼承結合虛函數的動態綁定實現 函數重載:同意作用域中允許多個函數使用同一函數名,但函數原型的形式參數的個數或者對應位置的類型不同。 虛函數:虛函數是類中被virtual修飾的成員函數 虛函數在公有繼承機構中在一個或多個派生類中被重定義,在被調用的過程中,通過指向基類的指針實現動態綁定。 多態實現 利用父類實現,隱藏或覆蓋父類的方法 方法的繼承:子類可以繼承父類的所有方法 方法的添加:在子類定義中加上新的方法,以針對子類實現相應的功能 方法的覆蓋:子類定義與父類同名的方法(多態) 定義同名但參數列表不同的方法,稱為方法的重載 定義同名且參數列表也相同的方法,稱為新增,用new修飾符,用來隱藏父類的方法 定義同名且參數列表也相同的方法並且父類中的方法用abstract/virtual進行修飾,子類中的方法用override進行修飾,稱為虛方法的覆蓋,覆蓋了父類的方法 虛方法 PK override 方法不能用static修飾 方法重寫與基類的簽名必須一致 virtual 不能與private一起使用 new 和override: new是隱藏父類的方法,如果將派生類的實例強制轉換為基類的實例,就仍然可以調用隱藏類成員。舉例: DerivedClass B = newDerivedClass(); B.DoWork(); // Calls the new method. B的DoWork()方法 BaseClass A = (BaseClass)B; A.DoWork(); // Calls the old method. A的DoWork()方法 override是覆蓋父類的方法,是完全接替的,父類的方法必須用virtual修飾。。當派生類重寫某個虛擬成員時,即使該派生類的實例被當作基類的實例訪問,也會調用該成員。 舉例: DerivedClass B = new DerivedClass(); B.DoWork(); // Callsthe new method. . B的DoWork()方法 BaseClass A =(BaseClass)B; A.DoWork(); // Also calls the new method. . B的DoWork()方法 多態二:抽象方法和抽象類 抽象方法和抽象類用abstract修飾 abstract使用注意事項: 抽象方法沒有方法體 抽象成員只能存在抽象類中 抽象類可以有非抽象成員 抽象類的派生類必須實現抽象方法體 抽象類只能用作基類,無法實例化 重寫:不同對象對於同一方法調用的不同行為(指不同對象收到相同消息時,會產生不同行為) 重寫 override PK重載 overload 重載overload 重載是方法名稱相同,參數或參數類型不同,進行多次重載以適應不同的需要。重載是面向過程的概念 重寫是基類中函數的重寫,是面向對象的概念 虛方法PK 抽象方法 虛方法 抽象方法 用virtual修飾 用abstract修飾 要有方法體,哪怕是一個分號 不允許有方法體 可以被子類override 必須被子類override 除了密封類都可以寫 只能在抽象類中 多態三:接口 interface關鍵字,接口中可以有屬性,方法(未實現) 如果一個類既繼承了類又實現了接口,那麼類要卸載前面。一個類只能繼承一個父類,但可以實現多個接口。 抽象類和接口 不同點: 不能直接實例化接口 接口不包含方法的實現 接口可以多繼承,類只能單繼承 類定義可在不同的源文件之間進行拆分 相同點: 接口、類、和結構都可以從多個接口繼承 接口類似於抽象基類,繼承接口的任何非抽象類型都必須實現接口的所有成員 接口和類都可以包含事件,索引器、方法和屬性