Person
インターフェースが与えられた場合:
_public interface Person {
Person getSpouse();
void marry(Person spouse);
}
_
スケルトン実装を作成しました:
_public abstract class AbstractPerson implements Person {
private Person spouse;
@Override
public Person getSpouse() {
return spouse;
}
@Override
public void marry(Person spouse) {
this.spouse = spouse;
((MarriedPerson) spouse).setSpouse(this);//forced to downcast
}
protected void setSpouse(Person spouse) {
this.spouse = spouse;
}
}
_
スケルトン実装でmarry(Person spouse)
を呼び出すことの欠点は、引数spouse
はAbstractPerson
のインスタンスでなければなりません。ただし、spouse.marry(this)
がmarry()
内で呼び出されると、無限にループし、スタックオーバーフローエラー
質問:ダウンキャストせずに結婚(人の配偶者)を実装することは可能ですか?
PeronAttributeクラスのMix-Inサブクラスの集約コレクションを検討する場合があります(またはPersonAttributeインターフェイスを実装します)。これは、Java LDAP Attribute/BasicAttribute実装に似ています。これにより、動作と構造の両方の特性を動的に拡張できます。従来のOO(Java/C++)私は「静的クラス階層」と呼んでいます。クラス定義はDDLに似ているため(RDBMSとテーブルに対応するため)、コンパイル時のチェック(実行時の遅延の問題と比べて)が優れており、UMLで簡単にモデル化できます。このアプローチは、JavaScriptのようなより完全に動的な言語へのギャップを埋めます(参照:NodeJSの台頭と1990年代後半からのNetscape livewireの生まれ変わり)
LDAPリファレンス: https://docs.Oracle.com/javase/7/docs/api/javax/naming/directory/Attribute.html
GoFリファレンス: https://martinfowler.com/bliki/GangOfFour.htmlhttps://martinfowler.com/eaaCatalog/ パターン:動作、構造、作成
Livewireリファレンス(1997): https://www.drdobbs.com/database/livewire-web-to-database-solutions-part/18441039https://cs.nyu。 edu /〜yap/html/tutorial/getstart.htm