我很难掌握以下问题的解决方案。
我正在将类与其对应接口解耦,但我需要扩展类以进行新的更改,而不是更改原始实现以符合开关闭原则。
这是实现 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( 创建一个接口吗?
如果是这样的话,那就更加混乱了。
谢谢
的确,由于您没有提供任何关于您想要完成的任务的描述,因此不可能有任何完整或具体的答案。
但这里有一两个提示:
如果你已经在使用HttpRequest
类,那么最好的办法可能是不要改变它;为了符合开关闭原则,正如你所说。所以是的,创建一个新类。
如果UrlMetadataResolver
类的新功能确实扩展了HttpRequest
类的功能;这意味着它使用HttpRequest
的方法和其他一些方法,那么是的,你应该从HttpRequest
继承,以便能够使用它的方法,并在新类中添加你的新方法。
在这种情况下,是的,您应该创建一个继承自IHttpRequest
并扩展它的新接口。接口的含义是允许更改事物的实现方式,而不改变事物的完成方式。也就是说,您以后可以使用另一种方法,并通过另一个类以另一种方式实现UrlMetadataResolver
功能。使用接口将允许您在IUrlMetadataResolver
接口的引用中仅更改该参数,而无需更改业务层中的任何内容。
正如建议的那样,组合也是一种很好的做法,但在我们想从多个类继承的情况下更有意义。C# 和 .NET 显然更喜欢组合而不是继承(它们做得很好(,因为它们不允许继承多个类。
另一方面,如果新功能不扩展,而是覆盖HttpRequest
的功能,那么要走的方法是将HttpRequest
方法标记为虚拟,继承和覆盖UrlMetadataResolver
。
当然,你可以假设你可以双向进行;覆盖和扩展HttpRequest
类。
当然,您始终可以创建一个与HttpRequest
无关的新类UrlMetadataResolver
。
希望我能帮忙, 快乐编码!
我建议创建一个基类来实现这些类共有的所有方法:
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
。