C#中的抽象类和接口[重复]

Posted

技术标签:

【中文标题】C#中的抽象类和接口[重复]【英文标题】:Abstract classes and interfaces in C# [duplicate] 【发布时间】:2011-01-19 12:13:36 【问题描述】:

可能的重复:Interface vs Base classInterface or abstract class?

大家好,

我只是在考虑抽象类和接口,我知道它们在技术上是如何工作的,但我不了解抽象类和接口的真正用途。 我的意思是当我们知道我们不能创建它的对象时为什么要使用抽象类,无论如何我们必须扩展这个类来使用它,所以我们为什么不把所有东西都放在派生类中。

接口也是如此,我们必须实现接口,所以我们为什么不将接口中定义的所有方法都放在我们实现接口的类中。

有人可以举一些例子来消除我的疑惑吗?

【问题讨论】:

看看这个谷歌视频:youtube.com/watch?v=4F72VULWFvc 【参考方案1】:

*** 上的链接

Exact use of Abstract class Interface or abstract class? Abstract classes vs Interfaces Why do both the abstract class and interface exist in .Net? differences between an abstract class and an interface in C# What’s the difference between an interface and an abstract class? When to use an interface instead of an abstract class and vice versa? Help me understand in a practical example the usage abstract classes vs interfaces?

其他

Abstract Class versus Interface Should I use an abstract class or an interface? Abstract base class over interface Learn This: When to use an Abstract Class and an Interface Recommendations for Abstract Classes vs. Interfaces - MSDN Working with Abstract classes, Sealed Classes, and Interfaces in C# Difference between Abstract class and Interface in C# (.Net)

【讨论】:

重复项的识别属于问题的 cmets,以及您拥有代表的密切投票。 它可能在几个小时后关闭。在我的帖子之前没有识别出链接! @Asad:这就是重点。 发现了重复,因此应该发布评论(而不是答案)投票关闭.权力伴随着责任。 嗯,你是对的。下次会注意的 但是,如果有人能收集所有重复的内容并将其组织得如此好,那么我的努力是值得回答的。【参考方案2】:

另外需要注意的是,在C#中你只能继承一个类,但可以继承多个接口。抽象类是具有多个子类的可重用代码的类的部分实现。接口就是这样,用于特定目的的对象的接口。

一个很好的例子是游戏中的对象。如果对象是 Drawable 和 Collideable,你可能有通用的例程来处理它,但没有通用的基类,所以你让类实现 IDrawable 和 ICollidable。

【讨论】:

【参考方案3】:

如果有多个派生类共享相同的抽象行为,你会怎么做?

举个很好的例子,考虑 .NET 中的 Stream 类。

【讨论】:

【参考方案4】:

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

接口(对我而言)只不过是一个蓝图。我从来不需要接口,但是当发布可扩展的 API 或在组织内创建框架时,接口是可扩展类的行为方式的良好蓝图。它有助于在命名空间内为一组特定对象所期望的功能定义一个标准。

我想说两者都不是特别必要的,但它们在分离代码和定义它应该如何使用和/或扩展方面非常有帮助。

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

接口意味着你可以定义一个类应该实现的方法,而无需实际实现它们。这很有用的一个例子是允许开发人员为您的应用程序编写插件。

在这个插件上可以调用哪些方法(比如load,unload,execute)一定要清楚,但是这些方法如何实现取决于插件本身。在设计接口时,您可能不知道这些方法的代码实际上是什么。

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

【讨论】:

【参考方案7】:

简单来说,您可以使用抽象类来模拟继承,例如 Car 从 Vehicle 继承。通常你也会继承一些实现或类定义。

接口用于对可能具有相似行为子集但不是必需的 is-a 关系的类型进行建模。例如,我可以有一个接口 IValidate,它有一个方法 Validate,这可以由 Car、Student、Account 等实现,以验证他们持有的数据。这些类型不能/不应该真正按原样关系建模

接口在不支持多重继承的语言中也被广泛使用作为一种解决方法。其他用途包括依赖关系分离,以及在 COM 和 WCF 中公开服务。

【讨论】:

以上是关于C#中的抽象类和接口[重复]的主要内容,如果未能解决你的问题,请参考以下文章

抽象类和接口

C#中的抽象类和抽象方法

抽象类和接口在一起?

PHP中的抽象类和接口

C#中的抽象类抽象方法和虚方法

scala 抽象类和trait的区别