web-dev-qa-db-ja.com

2つのインスタンスが相互に依存する可能性があるインターフェースを、ダウンキャストなしで、スケルトン実装、つまりクラスに実装する方法は?

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)を呼び出すことの欠点は、引数spouseAbstractPersonのインスタンスでなければなりません。ただし、spouse.marry(this)marry()内で呼び出されると、無限にループし、スタックオーバーフローエラー

質問:ダウンキャストせずに結婚(人の配偶者)を実装することは可能ですか?

3
Rui

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

0
hanasaki