2

この投稿Baseでは、勇敢な人が(C ++で)型のオブジェクトを型にダウンキャストしたいと考えていますDerived。Derived型に。よりも多くの属性がないと仮定すると、クラスが提供する追加のメソッドに嫉妬している場合は意味がありBaseますDerived

そのようなことを可能にするプログラミング言語はありますか?

4

3 に答える 3

1

実際、これはCommon Lispや、CLOS(Common Lis Object System)が移植された他のLisp方言で問題なく行われていることです。change-classそのためにジェネリック関数を使用します。

CLOSは複数のディスパッチメソッドで動作するため、メソッドはクラスやオブジェクトに関連付けられていません。引数のタイプ(またはID)と同様の関数WRTのグループで選択される関数にすぎません。を使用するchange-class場合、新しいインスタンスを作成しているかのように引数を指定でき、オブジェクトにすでに保存されているデータは残ります。これがどのように機能するかを示す小さなセッションです:

CL-USER> (defclass base ()
       ((name :initarg :name)))
#<STANDARD-CLASS BASE>
CL-USER> (defclass derived (base)
       ((age :initarg :age :initform 0)))
#<STANDARD-CLASS DERIVED>
CL-USER> (defvar foo (make-instance 'base :name "John Doe"))
FOO
CL-USER> (change-class foo 'derived :age 27)
#<DERIVED {100338F2D1}>
CL-USER> (with-slots (name age) foo
       (list name age))
("John Doe" 27)
CL-USER> (defvar bar (make-instance 'base :name "Baby Joe"))
BAR
CL-USER> (change-class bar 'derived)
#<DERIVED {10036CF6E1}>
CL-USER> (with-slots (name age) bar
       (list name age))
("Baby Joe" 0)
CL-USER> 

このデフォルトの動作では不十分な場合は、でメソッドを定義できますupdate-instance-for-different-class

そうそう、そのようなことを可能にするプログラミング言語があります

于 2011-07-26T09:52:58.247 に答える
1

いいえ、しかし、そもそもそれを行うのは強いコードの臭いです。

より良い代替方法は、デコレータパターンを使用することです。これは、まさにそれが行われたことです。

于 2011-05-11T17:54:23.310 に答える
0

属性を追加しない場合Derived、追加するメソッドは、から取得した状態で動作する必要がありますBaseBaseその場合、それらのメソッドをそれらが属する場所に移動しないのはなぜですか?

于 2011-06-03T01:00:25.467 に答える