この設計上の問題を解決する方法:インターフェイスに抽象化されたクラスから継承しますか?

RollRoll

私は次の問題の解決策を理解するのに苦労しています。

クラスを対応するインターフェイスで分離していますが、オープンクローズの原則に準拠するために、元の実装を変更するのではなく、新しい変更のためにクラスを拡張する必要があります。

これは、IHttpRequestを実装する基本クラスのHttpRequestです。

public class HttpRequest : IHttpRequest
{
    public string RawUrl { get; protected set; }

    public HttpRequest(string rawUrl)
    {
        RawUrl = rawUrl;
    }

    public string GetJsonFromUrl(string url)
    {
        //
    }
}

public interface IHttpRequest
{
    string GetJsonFromUrl(string url);
}

拡張クラスはUrlMetadataResolverです。

public class UrlMetadataResolver : HttpRequest
{
    public UrlMetadataResolver(string rawUrl) : base(rawUrl)
    {
        //
    }
}

私は何をすべきか?UrlMetadataResolver(IUrlMetadataResolver)のインターフェイスを作成する必要がありますか?

その場合、それはさらに混乱します。

ありがとう

コスタスダフノミリス

確かに、達成したいことについては何も説明していないので、完全な答えや具体的な答えはありません。

しかし、ここに1つか2つのヒントがあります。

すでにHttpRequestクラスを使用している場合は、おそらくクラスを変更しないのが最善です。あなたが言ったように、オープンクローズ原則に準拠するために。そうです、新しいクラスを作成します。

UrlMetadataResolverクラスの新しい機能が実際クラスの機能を拡張している場合HttpRequestつまり、のメソッドHttpRequestといくつかの追加のメソッドHttpRequest使用します。その場合、そのメソッドを使用できるようにするには、から継承し、新しいクラスに新しいメソッドを追加する必要があります。

そしてこの場合はそうです、それを継承しIHttpRequestて拡張する新しいインターフェースを作成する必要がありますインターフェースの意味は、物事の実行方法を変更することなく、物事の実装方法を変更できるようにすることです。つまり、後で別のアプローチを使用してUrlMetadataResolver、別のクラスによって別の方法で機能を実装できますインターフェイスを使用すると、ビジネスレイヤで何も変更せずに、IUrlMetadataResolverインターフェイスの参照でそれだけを変更できます

提案されているように、構成も良い習慣ですが、複数のクラスから継承したい場合には、より理にかなっています。C#と.NETは、複数のクラスの継承を許可しないことにより、継承よりも構成を明確に優先します(そしてそれらはうまくいきます)。

一方、新しい機能が拡張されず、の機能をオーバーライドする場合はHttpRequestHttpRequestメソッドを仮想、継承、オーバーライドとしてマークする方法がありますUrlMetadataResolver

もちろん、あなたは両方の方向に行くことができると仮定することができます。HttpRequestクラスをオーバーライドおよび拡張します

もちろん、UrlMetadataResolverとは関係なく、いつでも新しいクラス作成できますHttpRequest

私が助けてくれることを願っています、陽気なコーディング!

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

インターフェースを実装する、継承された抽象クラスからの値を持つコンストラクター

分類Dev

抽象クラスに継承されたジェネリックインターフェイスのインスタンス化の問題

分類Dev

Swiftが解決するように設計されたクラス初期化の問題をJavaはどのように解決しますか?

分類Dev

基本抽象クラスとIDisposableの正しい場所からインターフェースを継承する

分類Dev

クラスにインターフェイスを実装し、別のクラスから継承させるにはどうすればよいですか?

分類Dev

保護されたリソースから継承されたインターフェイスへの呼び出しをモックする方法

分類Dev

継承されたクラスから関数へのポインタをインスタンス化する

分類Dev

テンプレートクラスを継承し、現在継承しようとしているクラスのテンプレート化されたサブクラスにタイプを設定できますか?

分類Dev

基本クラスから継承されたインターフェイスをサブクラスで明示的に実装する必要がありますか?

分類Dev

2つのクラスを継承し、インターフェースから別々に実装します

分類Dev

C#の依存インターフェースを持つ抽象クラスから継承する正しい方法

分類Dev

クラスインスタンスのデータ型パラメータから抽象化する方法は?

分類Dev

インターフェイスから継承するクラス内のリスト-クラス内からリストに追加しますか?

分類Dev

クラスがインターフェースを実装するとき、クラスはインターフェース内で宣言された抽象内部クラスを継承しますか?

分類Dev

パラメータ化されたクエリが信頼できるアプリケーションシステムから取得された入力である場合、スキャンされたSQLインジェクションの問題を解決するにはどうすればよいですか?

分類Dev

子クラス/インターフェースの継承されたフィールド/メソッドを削除することは可能ですか?

分類Dev

インターフェイスオブジェクトにポリモーフィングした後、1つのクラスから継承されたプロパティをどのように保持しますか?

分類Dev

ジェネリックス:インターフェースを実装する抽象クラスから継承

分類Dev

シングルトンパターンを使用したPHPでのクラス継承は、継承されたクラスのインスタンス変数が再初期化された場合にのみ機能します。しかし、なぜ?

分類Dev

抽象クラスの難しさ:インターフェースからの継承

分類Dev

相対レイアウトから継承されたクラスにマージンを設定する方法

分類Dev

別のクラスを継承するクラスは、そのクラスがクラス/インターフェイスを継承することを継承しますか?

分類Dev

Clojureのクラスから洗練されたJavaインターフェースを呼び出す方法は?通話を解決できません

分類Dev

インターフェイスから継承されたメソッドは、インターフェイスにある別のタイプを返すことができますか?

分類Dev

インターフェイスからの多重継承(抽象クラス)

分類Dev

Javaクラスが実装されたインターフェースから注釈を継承しないのはなぜですか?

分類Dev

インターフェイスを使用する理由、クラスと継承の何が問題になっているのか

分類Dev

異なる型の引数を取得する、同じメソッドを持つインターフェイス、抽象クラス、および継承サブクラス、どちらが使用されますか?

分類Dev

Typescript:基本クラスの抽象コンストラクターパラメータシグネチャを抽象化および/または継承します

Related 関連記事

  1. 1

    インターフェースを実装する、継承された抽象クラスからの値を持つコンストラクター

  2. 2

    抽象クラスに継承されたジェネリックインターフェイスのインスタンス化の問題

  3. 3

    Swiftが解決するように設計されたクラス初期化の問題をJavaはどのように解決しますか?

  4. 4

    基本抽象クラスとIDisposableの正しい場所からインターフェースを継承する

  5. 5

    クラスにインターフェイスを実装し、別のクラスから継承させるにはどうすればよいですか?

  6. 6

    保護されたリソースから継承されたインターフェイスへの呼び出しをモックする方法

  7. 7

    継承されたクラスから関数へのポインタをインスタンス化する

  8. 8

    テンプレートクラスを継承し、現在継承しようとしているクラスのテンプレート化されたサブクラスにタイプを設定できますか?

  9. 9

    基本クラスから継承されたインターフェイスをサブクラスで明示的に実装する必要がありますか?

  10. 10

    2つのクラスを継承し、インターフェースから別々に実装します

  11. 11

    C#の依存インターフェースを持つ抽象クラスから継承する正しい方法

  12. 12

    クラスインスタンスのデータ型パラメータから抽象化する方法は?

  13. 13

    インターフェイスから継承するクラス内のリスト-クラス内からリストに追加しますか?

  14. 14

    クラスがインターフェースを実装するとき、クラスはインターフェース内で宣言された抽象内部クラスを継承しますか?

  15. 15

    パラメータ化されたクエリが信頼できるアプリケーションシステムから取得された入力である場合、スキャンされたSQLインジェクションの問題を解決するにはどうすればよいですか?

  16. 16

    子クラス/インターフェースの継承されたフィールド/メソッドを削除することは可能ですか?

  17. 17

    インターフェイスオブジェクトにポリモーフィングした後、1つのクラスから継承されたプロパティをどのように保持しますか?

  18. 18

    ジェネリックス:インターフェースを実装する抽象クラスから継承

  19. 19

    シングルトンパターンを使用したPHPでのクラス継承は、継承されたクラスのインスタンス変数が再初期化された場合にのみ機能します。しかし、なぜ?

  20. 20

    抽象クラスの難しさ:インターフェースからの継承

  21. 21

    相対レイアウトから継承されたクラスにマージンを設定する方法

  22. 22

    別のクラスを継承するクラスは、そのクラスがクラス/インターフェイスを継承することを継承しますか?

  23. 23

    Clojureのクラスから洗練されたJavaインターフェースを呼び出す方法は?通話を解決できません

  24. 24

    インターフェイスから継承されたメソッドは、インターフェイスにある別のタイプを返すことができますか?

  25. 25

    インターフェイスからの多重継承(抽象クラス)

  26. 26

    Javaクラスが実装されたインターフェースから注釈を継承しないのはなぜですか?

  27. 27

    インターフェイスを使用する理由、クラスと継承の何が問題になっているのか

  28. 28

    異なる型の引数を取得する、同じメソッドを持つインターフェイス、抽象クラス、および継承サブクラス、どちらが使用されますか?

  29. 29

    Typescript:基本クラスの抽象コンストラクターパラメータシグネチャを抽象化および/または継承します

ホットタグ

アーカイブ