async / await初期化メソッドによる継承

String.Empty

私のクラスには、初期化する必要のあるプロパティがあります。部分的に構築されたオブジェクトを通過したくないし、コンストラクターを非同期にすることはできない/すべきではないので、ここ説明するファクトリパターンを使用しているので、クラスは次のようになります。

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]

編集
0

コメントを追加

0

関連記事

分類Dev

Async / await:メソッドを非同期にする

分類Dev

Async / await:メソッドを非同期にする

分類Dev

React componentDidMount()メソッドでasync awaitを使用するにはどうすればよいですか?

分類Dev

typescriptの「async」メソッドが最初の「await」の発生まで同期のように機能する理由

分類Dev

メソッドasyncを変更せずにメソッド内でawaitキーワードを使用する方法

分類Dev

async / awaitでasyncメソッドとTaskSchedulerを呼び出す

分類Dev

C#async / awaitメソッドをF#に?

分類Dev

Winform-メソッドをasync / awaitに変更します

分類Dev

「then」と呼ばれるクラスメソッドでasync / await

分類Dev

async-awaitを使用するメソッドと同等のasync-await-freeとは何ですか?

分類Dev

asyncメソッドを呼び出すためにawaitキーワードを使用する必要がある理由

分類Dev

Span <T>およびasyncメソッド

分類Dev

async / await。メソッドの待機可能な部分の継続はどこで実行されますか?

分類Dev

async / await。メソッドの待機可能な部分の継続はどこで実行されますか?

分類Dev

async / awaitで「ハング」するメソッドを見つける方法は?

分類Dev

同期メソッドが混在している場合に、WebAPIでasync / awaitの利点を実現する

分類Dev

Action <>をAsyncメソッドに渡す

分類Dev

jQueryの$ .post()メソッドをasync / awaitとtypescriptで使用する方法

分類Dev

async / awaitを使用して.netのメソッドをチェーンする方法

分類Dev

async / awaitメソッド内の時間のかかるタスク

分類Dev

ObservableCollection <T>を返すメソッドでasync / awaitを使用する方法

分類Dev

タスクを返すすべてのメソッドにasync / awaitを使用する必要があります

分類Dev

C# async タスク - メソッドに複数の await() を含めることはできますか

分類Dev

c#async / await適切な構造で複数のメソッドを同時に実行する

分類Dev

module.exportのメソッドでasync / awaitを使用します

分類Dev

async / await OnNext / OnError / OnCompletedメソッドを使用してIObserverを実装するにはどうすればよいですか?

分類Dev

Async および Await Task - N 層アプリケーションでどのメソッドを非同期にするか?

分類Dev

@Asyncメソッド内のSpring @ Asyncメソッド

分類Dev

async.jsメソッド内のasync.jsメソッド

Related 関連記事

  1. 1

    Async / await:メソッドを非同期にする

  2. 2

    Async / await:メソッドを非同期にする

  3. 3

    React componentDidMount()メソッドでasync awaitを使用するにはどうすればよいですか?

  4. 4

    typescriptの「async」メソッドが最初の「await」の発生まで同期のように機能する理由

  5. 5

    メソッドasyncを変更せずにメソッド内でawaitキーワードを使用する方法

  6. 6

    async / awaitでasyncメソッドとTaskSchedulerを呼び出す

  7. 7

    C#async / awaitメソッドをF#に?

  8. 8

    Winform-メソッドをasync / awaitに変更します

  9. 9

    「then」と呼ばれるクラスメソッドでasync / await

  10. 10

    async-awaitを使用するメソッドと同等のasync-await-freeとは何ですか?

  11. 11

    asyncメソッドを呼び出すためにawaitキーワードを使用する必要がある理由

  12. 12

    Span <T>およびasyncメソッド

  13. 13

    async / await。メソッドの待機可能な部分の継続はどこで実行されますか?

  14. 14

    async / await。メソッドの待機可能な部分の継続はどこで実行されますか?

  15. 15

    async / awaitで「ハング」するメソッドを見つける方法は?

  16. 16

    同期メソッドが混在している場合に、WebAPIでasync / awaitの利点を実現する

  17. 17

    Action <>をAsyncメソッドに渡す

  18. 18

    jQueryの$ .post()メソッドをasync / awaitとtypescriptで使用する方法

  19. 19

    async / awaitを使用して.netのメソッドをチェーンする方法

  20. 20

    async / awaitメソッド内の時間のかかるタスク

  21. 21

    ObservableCollection <T>を返すメソッドでasync / awaitを使用する方法

  22. 22

    タスクを返すすべてのメソッドにasync / awaitを使用する必要があります

  23. 23

    C# async タスク - メソッドに複数の await() を含めることはできますか

  24. 24

    c#async / await適切な構造で複数のメソッドを同時に実行する

  25. 25

    module.exportのメソッドでasync / awaitを使用します

  26. 26

    async / await OnNext / OnError / OnCompletedメソッドを使用してIObserverを実装するにはどうすればよいですか?

  27. 27

    Async および Await Task - N 層アプリケーションでどのメソッドを非同期にするか?

  28. 28

    @Asyncメソッド内のSpring @ Asyncメソッド

  29. 29

    async.jsメソッド内のasync.jsメソッド

ホットタグ

アーカイブ