gpt4 book ai didi

c# - 抽象类与接口(interface)的建议

转载 作者:搜寻专家 更新时间:2023-11-01 03:06:36 25 4
gpt4 key购买 nike

我知道接口(interface)和抽象类的区别。现在我想知道我到底需要在什么地方使用接口(interface)而不是抽象类,反之亦然。

我引用的文章Recommendations for Abstract Classes vs. Interfaces

在那个

这里有一些建议可以帮助您决定是使用接口(interface)还是抽象类来为您的组件提供多态性。

  1. If you anticipate creating multiple versions of your component, createan abstract class. Abstract classes provide a simple and easy way toversion your components. By updating the base class, all inheritingclasses are automatically updated with the change. Interfaces, on theother hand, cannot be changed once created. If a new version of aninterface is required, you must create a whole new interface.

  2. If the functionality you are creating will be useful across a wide range of disparate objects, use an interface. Abstract classes shouldbe used primarily for objects that are closely related, whereasinterfaces are best suited for providing common functionality tounrelated classes.

  3. If you are designing small, concise bits of functionality, useinterfaces. If you are designing large functional units, use anabstract class.

  4. If you want to provide common, implemented functionality among all implementations of your component, use an abstract class. Abstract classes allow you to partially implement your class, whereas interfaces contain no implementation for any members.

我不确定第 3 点。我是否需要将组件的所有小功能都放入界面中?

有任何现实世界/可理解的例子可以帮助我做出选择吗?

最佳答案

接口(interface)就像契约(Contract)。如果您的代码的任何部分应该依赖于某些方法或属性的存在,那么接口(interface)是个好主意。它还为单元测试提供了更多空间。

很多时候我都定义了一个接口(interface)和实现它的抽象类。这样,您可以在不从基类派生的情况下实现接口(interface)。

至于真实的例子,例如考虑一个消息网关。 请注意,以下实现并不是 OOP 完美的。我只是不想创建那么多类和接口(interface)。

interface IMessageSender
{
string From { get; set; }
string To { get; set; }
string Message { get; set; }

void Send();
}

abstract class MessageSenderWithSubjectBase : IMessageSender
{
string From { get; set; }
string To { get; set; }
string Message { get; set; }

string Subject { get; set; }

abstract void Send();
}

class EmailSender : MessageSenderWithSubjectBase
{
override void Send() { // send email }
}

class SmsSender : IMessageSender
{
override void Send() { // send sms }
}

看,短信没有主题。您也可以从抽象类派生并忽略主题,但这不是一个清晰的设计。更不用说基类中存在您知道根本不需要的通用方法的情况。相反,您可以为没有主题的消息创建一个基类,或者只实现接口(interface)。

当您需要发送消息时,在代码中的某处,您可能会从某种工厂获得消息发送器,您可以相信它能够发送您的消息,因为它实现了接口(interface)。你可以像那样抽象。

虽然这个答案没有直接回答你的问题,但这是因为我不认为你可以像你读过的那样创建规则。给定时间和多行代码,您最终会明白何时需要接口(interface)、抽象类或同时需要两者。

关于c# - 抽象类与接口(interface)的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20193091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com