【问题标题】:Abstract Class vs Interface - Practical Application抽象类与接口 - 实际应用
【发布时间】:2014-07-14 18:59:47
【问题描述】:

我正在学习 OOP,我想我已经了解了抽象类和接口,但我仍然无法应用它们。

在“有”的情况下应考虑接口。在“is-a”的情况下应该使用继承。

现在让我们说我要构建以下类:

MyExcel:

  • 打开(路径)
  • 打开()
  • 保存(路径)
  • 导入(从数组)
  • 复制到(数据集)

我的访问:

  • 打开(路径)
  • 查询(SQL 命令)
  • 关闭()
  • 复制到(Excel)

假设目标是构建灵活的代码,例如

Dim test as MyDataStream
test = MyAccess

在我想从 Access 而不是 Exel 获取数据的情况下灵活。

我可以构建一个名为 MyDataStream 的接口或抽象类。 Excel 和 Access 将是一个 DataStream ('Is-A')。另一方面,我可以说我的 Excel 类正在定义与连接类的合同,因为它想要拥有它的方法。 MSDN 给出了以下判断标准:

  • 如果您预期创建组件的多个版本, 创建一个抽象类。 -> 是的,我喜欢,比如 PowerPoint 类、WebService 类等等。所以这一点适用于使用抽象类。

  • 抽象类应该主要用于 密切相关,而接口最适合提供 不相关类的通用功能。 -> Acutally 我的课程只需要相同的功能。所以这一点适用于使用接口。

我只是不确定我必须选择什么。 MyExcel 是一个数据流还是 MyExcel 有一个数据流?

如果有人能告诉我什么是最佳选择以及为什么,那就太好了。

【问题讨论】:

  • 一方面,您可以将通用的基本功能放在抽象类中。你不能对接口做同样的事情。除此之外,您的问题here 有很多帮助。请注意,抽象类是一种“是一种”关系,而接口通常是一种“具有这种”关系。比较 Stream 与 IEnumerable 或 IComparable。
  • 你好罗伯特。我已经在我的帖子中写了“is-a”“has-a”的区别(你真的读过吗?)谢谢你的链接我已经通过了关于 SO 的最高评价问题,但我仍然无法决定该怎么做,那这就是我提出这个问题的原因。我不认为这是重复的,因为这是 oop 主题的单独应用。
  • 那么您能否更具体地说明您要查找的内容?您想知道在重复帖子中以及在我链接的谷歌搜索中的众多帖子中尚未充分涵盖的内容?您是否像我要求的那样比较了 Stream 的使用方式和 IComparable 的使用方式? Filestream 是 Stream 但 List 具有 IEnumerable 功能。你看出区别了吗?
  • 我读了 100 本关于飞行的书并不意味着我会飞。我不想在这里重新发明轮子,我只需要帮助应用我上面提到的概念。我明白你的意思,我面前有两本关于 oop 的好书,但我仍然找不到解决我的问题的正确方法。如果您认为这不足以具体说明问题或提出问题的理由,请随时删除该帖子。
  • 您需要知道的一切都已经在您的问题中,除了您的示例错误。不太清楚你是怎么做到的。我会重新打开您的问题,但我完全不确定我们可以如何帮助您。您是否像我要求的那样检查了 Stream 和 IComparable 之间的用法差异?

标签: .net oop inheritance abstract-class


【解决方案1】:

我建议使用界面。继承常常用得太容易了。

如 MSDN 上所述,如果您需要的大部分内容是代码重用,请尝试在实用程序类中收集常用功能。这也称为组合。如果您需要使一些行为更具体(NetworkFileSaver 与 HarddriveFileSaver),抽象基类可能是您的最佳选择,也称为继承。

假设您要向 MyExcel 和 WebService 添加一个 MyDataStream 抽象基类。稍后,您将需要在 MyExcel 和 MyPowerpoint 中使用FancyTextEditor 功能。你将如何解决这个问题?您不能将其设为抽象基类,因为 MyExcel 需要同时具有这两个基类。您不能将其作为基类,继承自 MyDataStream,因为并非所有 MyDataStreams 都是 FancyTextEditors。

有关此主题的更多信息,请参阅 Google 上的“继承与组合”。

【讨论】:

  • 这是一个很好的观点。谢谢罗吉尔。我将使用一个界面,看看它是如何工作的。
猜你喜欢
  • 2017-02-19
  • 2016-03-24
  • 2010-12-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 2012-07-17
相关资源
最近更新 更多