次のコードは、関連するすべてのクラスが同じプロジェクトにある(determineSubClass
のメンバーであるBaseClass
)場合に非常にうまく機能します。
protected static BaseClass determineSubClass(String p1, int p2, Boolean p3) {
BaseClass baseObj = null;
if ( (baseObj = SubClassOne.ofType(p1, p2, p3)) != null )
return baseObj;
else if ( (baseObj = SubClassTwo.ofType(p1, p2, p3)) != null )
return baseObj;
else if ( (baseObj = SubClassThree.ofType(p1, p2, p3)) != null )
return baseObj;
else if ( (baseObj = SubClassFour.ofType(p1, p2, p3)) != null )
return baseObj;
else
return new SubClassDefault(p1, p2, p3);
}
BaseClass
しかし今、私は共有ライブラリプロジェクトに移動したいと思います。このプロジェクトではSubClassOne
、、、がライブラリSubClassTwo
ではなく、このライブラリを使用するアプリケーションで定義されています。SubClassThree
SubClassFour
もちろんBaseClass
、このライブラリを使用してすべてのアプリケーションに戻ることもできますが、疑問に思います。
- より良い解決策はありますか?
- ライブラリプロジェクトを維持
BaseClass
し、ライブラリプロジェクトから派生したすべてのスーパークラスについて知る必要をなくすソリューションはありますか?
編集(以下の@ahmet alp balkanの質問に答える):
ofType()
各サブクラスの2つのことを行います:
- 文字列p1と他のパラメータp2およびp3の内容に基づいて、インスタンス化されるサブクラスがそのタイプであるかどうかを判別します。
- 答えが肯定的である場合、それは自己サブクラスのオブジェクトをインスタンス化します。それ以外の場合は、nullを返します。
2番目の質問についてはBaseClass
、この時点で、すべてのサブクラスに共通のデータメンバーとメソッドがあり、インスタンス化するサブクラスを決定する責任を委任することを目的としたこの単一の静的メソッドのみが保持されます。
ところで、あなたの質問のおかげで、私は私の元の投稿でひどいタイプミスに気づきました:「SuperClassOne」は「SubClassOne」などでなければなりません。