Re: [問題] private繼承問題
※ 引述《qrtt1 (有些事,有時候。。。)》之銘言:
: 標題: Re: [問題] private繼承問題
: 時間: Wed Jul 16 09:49:27 2014
:
: ※ 引述《kiwatami (悠游自在)》之銘言:
: ............................................... 43
:
: → kiwatami:官方文件有說我就不能問嗎= =? 怎麼感覺你很不想我發言 07/15 22:08
: → Chikei:因為你一直在"你的想法"、"你覺得",這邊是Java版我們在討 07/15 22:59
: → Chikei:論的是Java,那當然所有不清楚的名詞最終都以JLS為標準 07/15 22:59
: → Chikei:現在JLS直接說明了private field就是不會被繼承,或者說這 07/15 23:00
: → Chikei:就是Java the Language的"繼承"定義,你再覺得不合理也請接 07/15 23:00
: → Chikei:受,因為我們是在討論Java語言。 07/15 23:01
: → Chikei:當然要來大戰Java定義的繼承跟一般programmer談到繼承時候 07/15 23:08
: → Chikei:的心靈模型一不一樣不是不可,但很明顯跟原po的問題無關 07/15 23:09
: → TonyQ:其實我覺得都可以討論啦 就是對語意瞭解不一致而已XD 07/16 06:21
: → TonyQ:也沒有人說不能/不想發言,原 po 多心了~ XD 07/16 06:22
: → kiwatami:不好意思 從小到大我覺得不合理的都不會接受... 沒有要吵 07/16 08:58
: → kiwatami:架的意思啦 只是覺得好像講出自己的想法反而不行的感覺 07/16 08:58
:
: http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.2
:
: Members of a class that are declared private are
: not inherited by subclasses of that class.
:
: 目前問題的關鍵在於 kiwatami 版友
:
: 沒有把 field 與 method 的繼承視為獨立事件。
:
:
: Members of a class 可以是 field 或 method,
:
: 版上已經接受規格定義的人,是將這二種 member 的繼承與否當成獨立事件
:
:
:
: --
: ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.130.128.164
: ※ 文章網址: http://www.ptt.cc/bbs/java/M.1405475369.A.20D.html
: → swpoker:每種語言都有不同的特質~要先放下自己~才能得到世界 07/16 11:44
: → ssccg:我不覺得他的問題跟field和method是不是獨立有關 07/16 12:42
: → ssccg:上一篇回的比較好,問題在inherit是可存取還是存在 07/16 12:43
: → swpoker:k版友的問題在於用自己的角度去理解JAVA~而忽略JAVA特性 07/16 14:29
: → swpoker:繼承是可不用複製貼上就可以存取成員~達到模組化的目的 07/16 14:30
: → swpoker:但是java特別注重在存取成員的特性包括對象及範圍 07/16 14:31
: → swpoker:類別A想套用類別X~那麼不用複製類別X的程式碼~繼承就好了 07/16 14:32
: → swpoker:但是也不代表類別X就要給人看光光~也些東西不可以給人看到 07/16 14:33
: → swpoker:所以根據對象及範圍的不同就有了這四種存取限制 07/16 14:35
: → NewSpec:勸k不要用這種心態來學習語言, 除了遇到瓶頸不容易突破外 07/16 21:05
: → NewSpec:也很容易在熟練某種技術後過於堅持, 而忽略其他技術的優點 07/16 21:07
我的立場比較接近 TonyQ 版僕,我認為沒有必要過度強調哪一個"說法"才是絕對
正確的,畢竟這與你對繼承的定義為何有關。
這裡是 Java 版,你可以說以 Java 官方的說法為準,在討論一些 Java 方面的
主題時,用語使用官方定義的說法是比較好溝通,假如主題已經是與"定義"本身
有關,我覺得只拿"官方說法"出來服人是不夠的。(可能對方根本無法了解或接受
官方說法的內涵)
看得出來 kiwatami 對"繼承"的定義是奠基在成本而非功能/界面上。
我猜他想釐清的是:
public class A {
private static int n;
private int num;
}
public class B extends A {
}
在 runtime B class object 在空間上的成本是否不小於 A class object?
B instance 在空間上的成本是否不小於 A instance?
若是的話,該用什麼樣的觀點去看這件事:class B 沒有繼承 class A 定義的
private field 的話,為什麼 B instance( or class object) 會負擔這個成本?
我是先接觸 C++ 後接觸 Java,在學習 C++ 的階段我也曾對何謂"繼承"感到
困惑過,有了一些想法後,在學 Java 時我對就沒有再著重於「Java 中繼承又
是怎麼一回事」。(實際上我不覺得我應該在學習 Java 時再盡力去試著接受或
理解 Java 宣稱的繼承是什麼)
給 kiwatami 與打從心底覺得沒有"繼承"的作用就不應該出現任何影子(任何可以
觀察到沒有被繼承的部分存在都算)者,可以試著參考看看。
我的看法是:
把擴充(繼承)與封裝(access privilege/modifier)當作是兩個正交的面向,Java
的 extends 屬於前者,擴充者承襲了被擴充者的所有內涵,至於擴充者能不能
碰觸這些東西,那是由後者(封裝程度)來決定。
或者是把一個 object 的規格(介面)與實作(內涵)分開來看,CB extends CA 的語意
是 CB 繼承了 CA 的規格與實作(IB extends IA, CB implements IA 則是 IB/CB
繼承了 IA 的規格),CA 的 private fields 是實作的細節,其成為 CB 實作(內涵)
的一部分,而 CA 定義的 private fields 都不屬於 CA 的規格(介面)的一部分,
故也不在 CB 的規格內。而當 CB instance 要去使用自身承襲 CA 而來的那一個
部分時,也必須同去使用另一個 CA instance 般透過其規格來使用。
*這種說法受 protected/package 的影響,特定條件下是說不通的,除非能接受
object 對外界所呈現的規格是浮動的看法(object 的規格非固定,會視觀察者而
改變)。
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.238.35.96
※ 文章網址: http://www.ptt.cc/bbs/java/M.1405529694.A.FCF.html
※ 編輯: sbrhsieh (36.238.35.96), 07/17/2014 00:59:02
※ 編輯: sbrhsieh (36.238.35.96), 07/17/2014 03:19:11
討論串 (同標題文章)