簡體   English   中英

面向對象語言中的繼承概念

[英]Conception of inheritance in object-oriented languages

我與我的一個朋友討論了多重繼承與單一繼承,並發現很明顯,我的面向對象設計概念與他的完全不同。 我主要是Obj-C程序員,所以我每天都不會使用多重繼承。 他主要是Windows / PSP下的C ++程序員,因此我們每天可能會使用不同的概念。

他實際上提出了以下主題:一個新人類是從什么繼承而來的?

我的想法是,將有一個人類類,而新的人類將從該類繼承,並從他的兩個父母那里獲得一些實例變量(例如他的DNA和其他)。

他的想法是,孩子將從他的兩個父母那里繼承下來,以獲得父母的方法。

現在我有點困惑,因為說實話...從對象繼承嗎? 繼承不是用於從包含某些對象組通用方法的類繼承嗎? 這種說法確實使我困惑不已。

直截了當進行類比,新人類的特征來自父母產生的一對受精卵,這些受精卵僅基於父母自身的DNA松散地產生。

實際上,我認為這只是一個不好的類比。 僅僅因為“繼承”是遺傳學(或遺囑法和合同法?)的借用術語,並不意味着它必須在概念上與軟件開發進行1:1匹配,實際上,它們只是表面上相似的概念。

例如,我的父親是律師,母親是學校老師。 我不是天生具有任何一種技能(行為,方法...)。

父母也是人類,屬於稱為哺乳動物的生物家族的一部分。 您的想法對我來說似乎最合乎邏輯。

public class Human extends Mammal implements HunterGatherer, Speech, CognitiveThought {

    public Human(Human mother, Human father) {
        super(mother, father);
        // ...
    }

    // ...
}

當然我看不到:

public class Human extends Mother, Father { ... }

我認為母親和父親相當樂於參與孩子的建造,三個人都是人類。

你們都錯了……孩子和父母都是人類的例證。 例如,在一個可能的類結構中,HumanBeing(全部)都繼承自“ Primate”,后者繼承自“ Mammal”,而Mammal繼承自“ Animal” ...

人類繼承了靈長類的所有行為,例如“ WalkUpright()”等。
靈長類動物從哺乳動物繼承所有行為,例如“ Lactate()”,“ LiveBirth()等...”。

HumanBeing的每個實例都可以具有兩個屬性,分別稱為父親和母親,分別是HumanBeing的一個實例...

也許還有另一個名為Children的屬性,其中包含HumanBeing對象實例的集合...

同意JeeBee,父母有建設性的作用!

public Class HumanFactory(Human mother, Human father)
{
    public Human NewHuman()
    {
        while(!mother.IsPregnant)  // may loop infinitely in the infertile case
            father.Mate(mother)
        while(mother.IsPregnant)
            System.Threading.Sleep(1000); // may take some months, get comfortable
        return mother.DeliverBaby();
    }
}

一個人將是一個階級,所有人類都屬於同一個階級。

孩子,父親和母親只是該類的實例。

父親和父親只是工廠(人類本身的綜合體)

我們可能會繼承“缺失的鏈接” ,但這取決於領域。

但是您的朋友有一個觀點,例如阿喀琉斯人從若蟲和人:S繼承而來,因此證明了多重繼承。

超人繼承Kriptonian,而蜘蛛俠是實施蜘蛛的人類! :P

好吧,我認為父母也是人。 因此父母是人類的財產。 它與OOP繼承無關。 如果您是指種族代表的人類類型,例如高加索人

就面向對象的行為而言,您朋友的想法是錯誤的。 一個人不會像上課那樣從父母那里繼承行為。 一個人從每個父母那里繼承了一半的基因,而這些基因結合在一起就會引起行為。 例如,即使父母雙方都具有特定的眼睛顏色,孩子也不一定具有相同的眼睛顏色(如果您不采用高中生物學,則應查找隱性基因)。

簡而言之,當您考慮類繼承時,請不要考慮人類繼承。 幾乎可以肯定不會有幫助。

簡短的回答是,您和您朋友的繼承觀念都受到許多人的擁護,並且同樣合法。

您朋友的概念更接近於“基於原型”的OO語言(例如,Self和Javascript)中的“對象繼承”。 您更喜歡Smalltalk,Java和C ++的典型“類繼承”。

Java(尤其是最近)傾向於將繼承視為所有與管理類型有關的內容,現在敦促使用“組合”而不是繼承來進行代碼重用。這部分是因為Java中的繼承不如組合靈活,因此“首選組合”是一種好習慣。 部分是因為“脆性基類問題”。

但是,如果您的朋友更習慣於創建“ mixins”,那么他可能會更多地將繼承視為一種庫。 在Java或C ++中,這可能都不是最佳實踐,但這一種通常可以理解繼承的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM