0

我刚刚读了一篇文章,上面写着:

子类耦合。当一个基类型(通常是类)有许多扩展它的派生类型时,理想情况下,其他类型应该只知道基类型。如果所有子类型共享相同的公共接口(从基类型继承的公共成员,为每个子类中的不同行为覆盖),那么外部“客户”类型可以将它们全部视为基类,就好像它们是基类一样。如果不是这样,如果客户端类型知道存在的子类型的细节,那么这就是子类耦合到所讨论的多态结构。

具体来说,最后一行说“如果客户端类型知道有关存在的子类型的详细信息......”。在 .NET 中,如果我使用WebRequest.Create("ftp://...");则我知道FtpWebRequest将返回 an,并且我可以更改特定于FtpWebRequest子类的属性,例如UseBinary属性。除非我对 WebRequest 的子类型有特定的了解,否则我将无法做到这一点,所以在我看来,这是一个子类耦合的情况,并且是糟糕的设计。

我很难相信这是代表 .NET 框架开发人员的糟糕设计,而是想象我对上述内容的理解有点偏离。有人能解释为什么我在 .NET 中提供的示例不是子类耦合的示例吗?

4

1 回答 1

1

我会说这取决于。很多时候你不想处理具体的类型,比如你的FtpWebRequest,因为这会让你耦合到那个类型。如果您改为使用一个调用的接口,IRequest或者IWebRequest您将不会与这些接口的具体实现耦合,这意味着在大多数情况下测试您的代码会更容易,并且您从 ftp 到其他一些协议,只要它们符合您正在使用的接口。但是,如果您正在做一些非常简单的事情,则可能不需要放入接口创建的额外抽象层。

简单的例子:

public interface IDoSomething { void DoSomething(); }
public class DoSomethingA { public void DoSomething(); }
public interface DoSomethingB { public void DoSomething(); }

public class UseDoSomething
{
    public UseDoSomething(IDoSomething do) { do.DoSomething(); }
}

如果您在课堂UseDoSomething上学习了其中一种具体类型;DoSomethingA或者DoSomethingB,您将对该实现有更紧密的耦合。通过我提供的示例,您可以自由使用任何实现IDoSomething作为输入,UseDoSomething这对未来非常有用,并且也更容易测试。您可能会意识到一切都取决于您的要求等。也许您必须使用具体类型,因为您需要访问该类型的特定事物,那么这样做可能很好。

我说清楚了吗?

于 2012-03-01T12:00:03.473 回答