C#中的抽象类和接口

7

可能的重复:
接口 vs 基类
接口还是抽象类?

大家好,

我正在思考抽象类和接口,我知道它们在技术上如何工作,但我不明白抽象类和接口的真正用途。 我的意思是,既然我们知道无法创建抽象类的对象,我们必须扩展该类才能使用它,那么为什么不将所有内容放在派生类中呢?

接口也是一样,我们必须实现接口,那么为什么不将接口中定义的所有方法都放在实现接口的类中呢?

有人可以用一些例子来解释一下我的疑惑吗?


看看这个谷歌视频: http://www.youtube.com/watch?v=4F72VULWFvc - Kieran
7个回答

16

2
将重复问题的识别放在问题的评论中,并在您有足够声望的情况下进行关闭投票。 - dmckee --- ex-moderator kitten
可能是几个小时后才关闭了。在我发布帖子之前,链接没有被识别! - Asad
2
@Asad:这就是重点。发现了一个重复的问题,所以应该发表一个评论(而不是回答)并且投票关闭。有权力就有责任。 - dmckee --- ex-moderator kitten
嗯,你说得对。下次会注意的。 - Asad
但是如果有人能够收集所有的重复内容并将其组织得很好,那么我认为这样的努力是值得一份答案的。 - nawfal

3
值得注意的是,在C#中,你只能继承一个类,但可以实现多个接口。抽象类是一个类的部分实现,其中包含可重用代码以供多个子类使用。接口只是对象的接口,用于特定目的。
一个很好的例子是游戏中的对象。如果对象既可以被绘制又可以碰撞,那么你可能有一些常见的例程来处理它,但没有公共的基类,因此你需要将该类实现IDrawable和ICollidable接口。

2

当有多个派生类共享相同的抽象行为时,您该怎么办?

以.NET中的Stream类为例,这是一个很好的例子。


0

我一直将抽象类作为派生类的路线图。很多时候,我会有一系列相似的类,它们都能共享功能,但又各自不同,需要拥有自己的类。因此,基类并不完全功能化,它有一些方法是为了那个特定的类而设计的。因此,通过声明它为抽象类,您可以将功能放入命名空间以供通用使用,但仍然可以将其使用限制在该类集合中。

接口(对我来说)只是一个蓝图。我从未需要过接口,但在发布可扩展API或在组织内部制作框架时,接口是描述可扩展类应如何行事的良好蓝图。它有助于定义命名空间中特定对象所期望的功能标准。

我认为两者都不是必需的,但它们在隔离代码和定义如何使用和/或扩展代码方面非常有帮助。


0
在我的工作中,当我想要为特定类型的组件创建插件,并且这些组件需要被应用程序相同地处理,但它们的行为是特定于组件的时候,我使用接口。在其他情况下,我希望派生类之间有一些共同的行为,因此我使用抽象类来定义派生类需要实现的方法,但只需要在必要时实现特定于组件的行为。

0

接口意味着您可以定义类应该实现但实际上没有实现的方法。为什么这很有用的一个例子是允许开发人员为您的应用程序编写插件。

必须清楚地知道可以在此插件上调用哪些方法(例如load、unload execute等),但这些方法的实现方式取决于插件本身。在设计接口时,您可能不知道这些方法的代码实际上是什么。

至于抽象类,虽然相似,但通常用作类似类的基础。在Stream基类的情况下,它具有读取一块字节的方法,它可以通过重复调用方法来调用单个字节。如果您有几个从此基类派生的类,则不必在每个类中重复此代码;因此,通常使用抽象类来减少代码重复。


0

简单来说,您可以使用抽象类来模拟继承,例如汽车从车辆继承。通常,您还将继承一些实现或类定义。

接口用于建模可能具有类似行为子集但不一定是is-a关系的类型。例如,我可以有一个名为IValidate的接口,其中包含一个Validate方法,可以由Car、Student、Account等实现以验证它们所持有的数据。这些类型不能/不应该真正被建模为is-a关系

接口也广泛用于不支持多重继承的语言中作为解决方法。其他用途包括依赖项分离和在COM和WCF中公开服务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接