如何解决此设计问题:从抽象到接口的类继承?

时间:2018-10-20 02:10:42

标签: c# oop solid-principles

我很难解决以下问题。

我正在将类与其对应的接口分离,但是我需要扩展该类以进行新的更改,而不是更改原始的实现,以符合开放关闭原则。

这是实现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)创建一个接口吗?

如果是这种情况,那就更加令人困惑了。

谢谢

2 个答案:

答案 0 :(得分:2)

的确,由于您没有提供关于要完成的任务的任何描述,因此不会有任何完整或特定的答案。

但这是一两个提示:

如果您已经在使用HttpRequest类,那么最好的办法就是不要更改它;如您所说,为了遵守开闭原则。是的,创建一个新类。

如果UrlMetadataResolver类的新功能确实在扩展HttpRequest类的功能;意味着它也使用HttpRequest的方法和其他一些方法,那么是的,您应该继承自HttpRequest,以便能够使用其方法并将新方法添加到新类中。

在这种情况下,是的,您应该创建一个继承自IHttpRequest并扩展它的新接口。接口的含义是允许更改事物的实现方式,而不更改事物的完成方式。即您以后可以使用另一种方法,并由另一个类以另一种方式实现UrlMetadataResolver功能。使用接口将仅允许您更改IUrlMetadataResolver接口的引用中的内容,而无需更改业务层中的任何内容。

如建议的那样,

组合也是一种很好的做法,但是在我们要从多个类继承的情况下,意义更大。 C#和.NET通过不允许继承多个类而明显地倾向于使用组合而不是继承(它们做得很好)。

另一方面,如果新功能没有扩展,而是覆盖了HttpRequest的功能,那么可行的方法是将HttpRequest方法标记为虚拟,继承并在UrlMetadataResolver中覆盖。

您当然可以假设可以同时进行;覆盖并扩展HttpRequest类。

您当然总是可以创建一个与UrlMetadataResolver无关的新类HttpRequest

希望我能帮上忙, 快乐的编码!

答案 1 :(得分:0)

我建议创建一个基类,该基类实现该类共有的所有方法:

public abstract class HttpBaseRequest : IHttpRequest
{
    protected HttpBaseRequest(string rawUrl)
    {
        RawUrl = rawUrl;
    }


    public string RawUrl{ get; protected set; }


    public string GetJsonFromUrl(string url)
    {
        return "";
    }
}



public class HttpDataRequest : HttpBaseRequest
{
    public HttpDataRequest(string rawUrl) : base(rawUrl) { }
}



public class UrlMetadataResolver : HttpBaseRequest
{
    public UrlMetadataResolver(string rawUrl) : base(rawUrl) { }
}

如果需要,您仍然可以创建界面IUrlMetadataResolver