私のクラスには、初期化する必要のあるプロパティがあります。部分的に構築されたオブジェクトを通過したくないし、コンストラクターを非同期にすることはできない/すべきではないので、ここで説明するファクトリパターンを使用しているので、クラスは次のようになります。
public class BaseClass
{
public PropType AsyncProp1 { get; set; }
public static async Task<BaseClass> CreateObject()
{
var baseClass = new BaseClass()
{
AsyncProp1 = await GetProp1Async()
};
return baseClass;
}
}
これまでのところ、そのパターンはうまく機能しましたが、BaseClassを拡張し、オブジェクトを使用する前に初期化する必要がある他の非同期プロパティを持つ他のクラスを実装する必要があります。
私の最初の計画は、CreateObject()メソッドを単純にオーバーライドすることでしたが、静的メソッドを仮想化/オーバーライドすることはできません。次に、基本クラスでCreateObject()メソッドを非表示にし、派生クラスに次のような新しいCreateObject()メソッドを含めることにしました。
public class DerivedClass : BaseClass
{
public PropType AsyncProp2 { get; set; }
public static new async Task<DerivedClass> CreateObject()
{
var derivedClass = new DerivedClass()
{
AsyncProp1 = await GetProp1Async(),
AsyncProp2 = await GetProp2Async(AsyncProp1) // can't do that - AsyncProp1 is not static
};
return derivedClass;
}
}
言うまでもなく、派生クラスごとに、継承されたプロパティの初期化を書き直す必要があります。それだけで継承の概念全体に反しますが、最悪の部分は、派生クラスのこれらの新しい非同期プロパティの一部が基本クラスの古い非同期プロパティに依存していることですが、CreateObject()内でそれらを単純に呼び出すことはできませんそれらは静的プロパティではないため、メソッド。
私が現在持っているものを改善し、このCatch22の問題を回避し、上記のことを達成する方法はありますか?
[編集]
少しコンテキストを与えるために、クラスの外部で呼び出される初期化メソッドに依存したくない理由は、オブジェクトを作成してそのような初期化メソッドを呼び出すコードを制御できない可能性があるためです。そのため、「すぐに使用できる」オブジェクトを呼び出し元に返したいのです。
Stephen Clearyの次の投稿を読んで、非同期で初期化されたオブジェクトにパブリックの非非同期プロパティを公開するAPIを持たせるのは撞着語だと述べていると思います(AsyncProp1
)。これは、非同期プロパティが必要になることを意味します。
このオブジェクトへのインターフェースを再設計して、そのメソッドのいずれかも非同期にし、それらのメソッドに内部的に初期化されるようにすることができます(InitAsync
必要に応じて待機します)。...誤用を防ぐことがあなたの主な目標である場合。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加