抽象类与接口 - 实际应用

时间:2014-05-26 04:31:16

标签: .net oop inheritance abstract-class

我正在学习OOP,我想我已经理解了抽象类,接口,但我仍然有问题要应用它们。

接口应该考虑到“a-a'的情况。继承应该用在' is-a'案例。

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

MyExcel:

  • 打开(路径)
  • 打开()
  • 保存(路径)
  • 导入(来自数组)
  • CopyTo从(数据集)

MyAccess:

  • 打开(路径)
  • 查询(SQL命令)
  • Close()方法
  • CopyTo从(Excel)中

我们的目标是建立像

这样的灵活代码
Dim test as MyDataStream
test = MyAccess

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

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

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

  • 抽象类应主要用于对象 密切相关,而界面最适合提供 不相关类的常用功能。 - >实际上我的课程只需要相同的功能。所以这一点适用于使用界面。

我只是不确定我要选择什么。 MyExcel'是一个' Datastream或MyExcel'有一个'数据流?

如果有人能告诉我什么是最好的选择和原因,那将是很棒的。

1 个答案:

答案 0 :(得分:0)

我建议使用界面。继承通常很容易使用。

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

假设您要将MyDataStream抽象基类仅添加到MyExcel和WebService。稍后,您将需要MyExcel和MyPowerpoint中的FancyTextEditor功能。你将如何解决这个问题?你不能把它变成一个抽象的基类,因为MyExcel需要有两个基类。您不能将其作为基类,继承自MyDataStream,因为并非所有MyDataStream都是FancyTextEditor

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