私は次の問題の解決策を理解するのに苦労しています。
クラスを対応するインターフェイスで分離していますが、オープンクローズの原則に準拠するために、元の実装を変更するのではなく、新しい変更のためにクラスを拡張する必要があります。
これは、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は、複数のクラスの継承を許可しないことにより、継承よりも構成を明確に優先します(そしてそれらはうまくいきます)。
一方、新しい機能が拡張されず、の機能をオーバーライドする場合はHttpRequest
、HttpRequest
メソッドを仮想、継承、オーバーライドとしてマークする方法がありますUrlMetadataResolver
。
もちろん、あなたは両方の方向に行くことができると仮定することができます。HttpRequest
クラスをオーバーライドおよび拡張します。
もちろん、UrlMetadataResolver
とは関係なく、いつでも新しいクラスを作成できますHttpRequest
。
私が助けてくれることを願っています、陽気なコーディング!
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加