父類調用子類方法

通常是父類裏作虛函數,子類裏實現該函數或重寫該函數。php

先說父類作虛函數,子類作實現的。java

一種應用就是,父類描述一種結構,好比要實現數據查詢的,父類中的數據處理依賴於一個數據來源,該來源多是本地文件,也多是遠程文件,甚至多是被包裝在某個文件中的,但均可抽象爲一個統一的接口,好比有讀取和寫入兩種操做。這樣父類中對數據的讀取或寫入可作成虛函數。
例 父類:函數

class BaseCls {
    //舉例方法,該方法是公有的,具體實現代碼不寫了
    public object listAll(){
        //方法中會用到Get方法
    }
    //兩個虛方法,須要子類重載
    //abstract是C#中虛方法的關鍵字,php和java我不會
    //這兩個虛函數是不用實現代碼的,僅代表存在這兩種操做,具體代碼。須要到子類中實現 
    public abstract object Get(key);
    public abstract object Set(key, value);
}

而對應不一樣的數據來源,有不一樣的子類,子類中實現該數據源的鏈接,好比操做本地文件的,讀取和寫入操做被重載爲對文件的讀寫。
例 子類1:spa

class class1 : BaseCls {
    //實現方法
    public object Get(key){
        //對磁盤的操做
    }
    public object Set(key, value){
        //對磁盤的操做
    }
}

例 子類2:code

class class1 : BaseCls {
    //實現方法
    public object Get(key){
        //經過某種協議對遠程文件的操做
    }
    public object Set(key, value){
        //經過某種協議對遠程文件的操做
    }
}

這樣,咱們在使用時,根據須要,建立某個子類的實例後,不光可用Get,Set方法,並且能夠調用父類的listAll方法,而父類的listAll會正確地調用子類的Get,對Get返回的結果進行整理等操做。orm

若是是重寫,差很少的狀況,只不過相比 虛函數/實現 的例子,是父類裏已經實現了Get和Set,但若是子類要求用另外一種方式實現Get和Set操做,能夠進行重寫。
重寫的做用一般是將讀寫操做重定向到別的地方,好比控制檯輸出,Console.Write(),一般講是輸出到控制檯界面,但若是該方法能夠被重寫,那麼咱們能夠作一個子類繼承自Console,而後重寫一下Write方法,輸出到咱們但願的地方,好比文件。以後若是咱們經過咱們作的這個子類實現一個控制檯實例,對他的Write,包括創建在Write基礎之上的WriteLine(實際就是經過Write實現的),都會寫到文件中,而不是控制檯界面。
(Console的例子只是舉例,實際狀況可能不是這樣的)對象

說簡單一些,父類子類是多態的一種表現形式,一個父類可能是抽象出來一些子類的共性,多個子類繼承父類這些共性。
好處是:
1.精簡代碼,方便後期維護。對於共性只用修改父類就可以影響繼承其的子類。
2.父類引用指向子類對象的能夠下降程序的耦合性。繼承

相關文章
相關標籤/搜索