Index: [Article Count Order] [Thread]

Date:  Sun, 18 Jun 2000 20:01:14 +0900
From:  Kaoru Hosokawa <khosokawa@....com>
Subject:  [XP-jp:00543] Re: XP Installed26 Part1 Test-first, by Intetion
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <B572DAC9.1EEE%khosokawa@....com>
In-Reply-To:  <006f01bfd61b$947c5320$281e140a@tokura>
Posted:  Sun, 18 Jun 2000 20:00:17 +0900
X-Mail-Count: 00543

ホソカワです。

on 2000/06/15 1:11 AM, Hisashi Yoshida at steven@....jp wrote:

> よしだです。
> 
> #やはり、全体に対してはコメントが書きにくい(論点が不明になって
> #しまう。変換した後の文章が「大作」なので…。)ので、部分的な
> #コメントにします。
> 
> コンストラクタについて:
> 
> Javaではコンストラクタの実行順序を考慮しないと行けないと思いま
> すので以下のような差があります。
> 
>> <Smalltalk>
>> === Page 191 Code 3
>> 
>> setName:aString amount:aNumber
>> name:=aString
>> amount:=aNumber
>> </Smalltalk>
> 
>> /*
>> しかし、実際にはつぎのようなものでも十分かもしれません。
>> */
>> private /* or protected */ void setNameAndAmount(String aString, int
>> aNumber){
>> name = aString;
>> amount = aNumber;
>> }
> 
> Javaでは、ここではprivate以外ではいけません。理由は「オブジェクト生成」
> の動作の違いにあります。「初期化」目的のメソッドですので、コンストラクタで
> 使用されますが、サブクラスでオーバーライドできてしまうと、例えば、以下のよ
> うな問題となります。
> 
> class Base {
> String name_;
> 
> Base(String name) {
> setName(name);
> }
> 
> protected void setName(String name) {
> name_ = name;
> System.out.println(name_);
> }
> }
> 
> class Foo extends Base {
> String fooSuffix_ = "Foo";
> 
> Foo(String name) {
> super(name);
> }
> 
> /**
> * new Foo("名前")の結果が、"名前Foo"となることを期待している
> * が、うまく行きません。コンストラクタと生成の順序を考えましょ
> * う。
> */
> protected void setName(String name) {
> /* 自分のインスタンス変数(fooSuffix_)が問題。*/
> name_ = name + fooSuffix_;
> System.out.println(name_);
> }
> }
> 
> まだ、superのコンストラクタ実行中は、インスタンス変数fooSuffix_が設
> 定されてないわけです。newというメッセージによって具象オブジェクトが
> できてしまってからConstructor Parameter Methodが呼び出される
> Smalltalk とは異なるわけです。(実際にはprivateプロトコルに置くので
> 同様のことを考慮している?かもしれないですが。)
> 
> #あまり良い例でないかな。

いや、よくわかりました。setNameAndAmount()は、protectedではオーバーライドさ
れると困るので、「setNameAndAmount()は、privateである。」と言う事ですね。
final を使って、オーバーライドできないようにする事もできますけど、外から呼ば
れる必要がないメソッドですから、privateでいいですね。

> --
> 吉田 尚志 steven@....jp
> 
> 

-- 
Kaoru Hosokawa
khosokawa@....com