【问题标题】:Trying to get a real world concept of Abstract class vs Interface in asp.net试图在 asp.net 中获得抽象类与接口的真实世界概念
【发布时间】:2011-12-21 05:59:30
【问题描述】:

我搜索了众多 S/O 帖子,但没有找到对我有帮助的答案。
我想了解什么是抽象类和接口是什么。我已经阅读了这篇文章Real world abstract class usage simple samples,但我仍然不清楚这些概念。

我希望有人能以“Person”对象的形式描述一个真实的世界。 所以继承将是 "Person" --> "Employee" --> "Manager"
最重要的是“员工工资”将变为“销售员工佣金”

如何在 Person 对象概念中描述抽象类和接口?

【问题讨论】:

    标签: oop interface abstract-class


    【解决方案1】:

    对于使用接口和抽象类的主题有不同的看法。但是,接口应该表达对象的行为(它可以做什么),而抽象类应该定义它是什么。从对象的角度来看,基本上是“我可以”与“我是”。

    所以,如果我们有一个人,那是一个名词,所以我们将使用一个抽象类来定义它。任何“是”人的东西都将从该类继承。如果我们想定义一些行为来描述 Person 能够执行的某些行为,但不会扩展到所有 Person,我们应该将其放入接口中。

    使用您定义的关系(Person -> Employee -> Manager),我们可以说 Employee 实现了 IFirable,而 Manager 实现了 IFirer。员工可以被解雇,经理也可以解雇员工。

    【讨论】:

    • 很好的比喻。你是说 Person 是一个抽象类吗?
    • @DotNetCookie - 我真的不想对此说是或否。这完全取决于您要解决的问题的上下文。如果您需要能够实例化一个“普通”的 Person 对象,那么这将没有多大意义。在这种情况下(Person -> Employee -> Manager),将基类 Person 设为抽象可能是有意义的。
    • 我用于 Person 接口的行为是 IEat,它可以声明一个 Feed 方法。关键是界面交叉,所以 Mammal : IEat > Person > etc. 和 PlantLife : IEat > Cactus,所以 Person 不是 PlantLife(有些人喜欢它),但它们都以某种方式进食。
    【解决方案2】:

    抱歉,我没有使用您的个人示例,请将此仅作为扩展评论。

    我发现向没有编程背景的人解释这些概念最容易,使用大多数人已经理解的类比:塑料成型!

    假设我们正在制作塑料水果:

    界面就像模具,它具有最终产品的形状,但你可以用各种不同的颜色和材料填充它。即使颜色和质地完全不同,它们最终都会具有相同的形状。

    抽象类更像是需要额外步骤的东西,比如绘画。你创造了基本的塑料水果,然后把它送去涂上一些绘画或毛皮之类的东西。

    未完成的水果就像一个抽象类,它比模具对最终产品的定义更多,但它本身并不完整。它需要更多的工作来完成,最终产品可能是完全不同的颜色,但它们仍然基本相同。

    希望对你有帮助!

    【讨论】:

      【解决方案3】:

      好的,让我们看看我是否理解你的问题......

      我认为您在概念上不确定接口和抽象类的使用之间的差异和/或相似之处。如果这就是问题所在,那么这就是我的“10 人入门”摘要;

      抽象类不能被实例化,但可以包含实现细节,所以当从一个类派生一个类时,你会得到契约和你放在抽象类中的任何默认行为.例如,您的 Person 类(在此示例中我假设它是一个抽象类)将定义派生 Employee 或 Manager 类必须(至少)具有的合同,但也可以提供一些默认行为。

      另一方面,接口只指定合约;实现类必须做什么,它们不能提供任何实现方式。例如,如果您示例中的“Person”实际上是一个接口,它将定义实现它的类(员工和经理)必须执行的操作,但不能为该合同提供任何默认实现。

      另请注意,在许多语言(Java、C#、Delphi)中,您只能从一个父类继承,但可以实现多个接口。

      【讨论】:

        猜你喜欢
        • 2016-02-15
        • 1970-01-01
        • 1970-01-01
        • 2012-09-29
        • 2019-05-17
        • 2012-08-17
        • 2014-07-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多