我很难解决以下问题。
我正在将类与其对应的接口分离,但是我需要扩展该类以进行新的更改,而不是更改原始的实现,以符合开放关闭原则。
这是实现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)创建一个接口吗?
如果是这种情况,那就更加令人困惑了。
谢谢
答案 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
。