【问题标题】:Interface vs. Abstract class for a model with objects that share some attributes [closed]具有共享某些属性的对象的模型的接口与抽象类[关闭]
【发布时间】:2014-07-17 09:28:37
【问题描述】:

我的应用程序主要由广告系列组成。它们是我模型的主要对象。 我有两种类型的广告系列:

  1. Ad hoc:立即运行一次的广告系列
  2. 已计划:计划在未来投放的广告系列,可以根据他们的日程安排多次投放。

这两者之间有共享的属性,并且每个属性都有特定的属性。设计此数据模型的最佳方法是什么? InterfacesAbstract classes?

假设这两种类型的广告系列都可以有一个 Id 和一个 Name 并且:

  • 只有 Ad hoc 活动有一个名为 RecipientsDataTable
  • 只有计划的广告系列有一个名为 ScheduleList<DateTime>

如果您愿意不投票或要求关闭此问题,请提供您推荐模型的基本结构,包括 access modifiersabstract/virtual 或其他有助于我获得更好结构的关键字对于我的模型。

【问题讨论】:

  • 请提供您推荐模型的基本结构,包括访问修饰符和 abstract/virtual 或其他关键字,这将有助于我的模型有更好的结构。 - 你想要有人为你设计你的整个架构?那么最好发布你的整个规范。
  • 投反对票不是卑鄙的行为。可悲的是,在我看来,您的问题是基于意见的。但我会让人们做他们自己的意见。
  • 如果您需要实现任何常见的例程、属性等,请使用抽象类...您也可以使用接口,然后让抽象类实现该接口。
  • @AntP 不,我不希望任何人设计我的整个架构。我只是在寻找处理这种设计的最佳方式。
  • 好吧,我有点夸大了,但我想强调一点,鉴于提供的信息,没有人可以回答这个问题。问题中绝对没有任何内容表明抽象类或接口更合适——信息太高级了。无论如何,答案可能是“两者兼而有之”。如果您有共享功能,请使用抽象基类。如果没有,不要。无论如何,您可能都想使用接口。

标签: c# .net oop interface abstract-class


【解决方案1】:

如果不很好地理解你在做什么,这很难回答,不幸的是它非常基于意见。

但是,在非常简单的层面上,如果您使用接口,您通常必须在实现属性(方法、属性等)之间复制代码。基类为它们提供了此功能。出于这个原因,我经常使用基类,除非有特定原因说明接口更合适。

我建议不同类型的广告系列本质上都是广告系列,因此有一个基类。但是,他们将针对不同的实体(人、慈善机构、公司),这些实体都需要一种联系方式(电子邮件/电话/地址)何时使用界面的更好示例。

但是,您需要考虑要覆盖哪些方法,哪些是更简洁的解决方案。

【讨论】:

  • 我同意。例如。除了标记(临时,计划)之外,我看不到任何区别,并且会从 ONE 模型处理两者,因此计划的活动也可以有接收者....并且临时的计划要么为零,要么按计划获取当前时刻。
【解决方案2】:

一般来说,如果它们共享共同的行为(代码),则该代码应该存在于抽象类中。如果它们执行相同的角色,请将它们放在接口后面。

在你的情况下,你似乎有两个共享属性,都是一个简单的值,它并没有真正定义行为,所以仅仅基于这些属性,我只需要一个接口。

如果你决定创建一个抽象类(也许有一些代码两种类型都想共享),你仍然可以保留接口。有一天,您可能会拥有第三种活动类型,它不与其他活动共享行为(因此不实现相同的抽象类),但执行相同的角色(因此实现相同的接口)。

对于抽象类中的访问修饰符,如果两个类只共享两个属性,则只需在抽象类中定义它们,不使用abstractvirtual 关键字。

【讨论】:

  • 我认为一个主要问题是 BLL 也在哪里。是campaign.Send() 还是Send(campaign)?
猜你喜欢
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-16
  • 2021-05-24
  • 2021-12-11
  • 1970-01-01
相关资源
最近更新 更多