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



我很难掌握以下问题的解决方案。

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

这是实现 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

最新更新