抽象和继承有什么区别?

What is the difference between Abstraction and Inheritance?

我在任何地方都找不到这个问题。根据我的理解,继承 should/might 是抽象的子集。

首先,当您将 class 标记为抽象时,您无法创建实例。 Abstract classes只用于继承。

但是当您从非抽象 class 继承时,您可以从派生和基础 classes 创建实例。所以你可以说抽象 classes 用于生成新类型,被继承而不是创建实例!

这也与多态性有关。

例如,您有一个基本员工 class,如下所示: public class 员工

{
    public string Name { get; set; }
    public double Salary { get; set; }

    public void IncreaseSalary(double rate)
    {
        this.Salary += (this.Salary * rate / 100);
    }
}

现在,当我们像下面这样创建 SalesRepresentative class 时,我们应该从 Employee 继承它,因为 SalesRepresentative 是一个 Employee。 public class 销售代表:员工

{
    public double AnnualSalesAmount { get; set; }
}

现在 SalesRepresentative 对象有 IncreaseSalary 方法,因为它是从 Employee 继承的。但一般来说,销售代表和员工的工资会通过不同的方式增加,例如根据他们的年销售额。

在这种情况下,您应该能够从 SalesRepresentative 更改 IncreaseSalary 的方法代码,但您不能。实际上现在你遇到了多态性

现在让我们来抽象一下。如果你想从 inherited class 更改 IncreaseSalary 的默认代码,有 2 个选择。首先将方法标记为 Virtual。第二个是将其标记为抽象。

不同的是如果你把它标记为虚拟的。您不必在 SalesRepresentative 中实现它,但是如果您将其标记为抽象,则必须实现它,并且您应该忘记抽象成员只能在抽象 class 中。检查以下示例:

public abstract class Employee

{
   public string Name { get; set; }
   public double Salary { get; set; }

   public abstract void IncreaseSalary(double rate);

}

public class 销售代表:员工

{
    public double AnnualSalesAmount { get; set; }

    public override void IncreaseSalary(double rate)
    {
        if (this.AnnualSalesAmount > 100000)
        {
            this.Salary += (this.Salary * (rate + 5) / 100);

        }
        else
        {
            this.Salary += (this.Salary * rate / 100);
        }
    }
}

首先你们应该知道,在解释这些术语和概念时总是有一些回旋余地。以下是我的看法。

抽象是概念,继承是技术实现。


抽象通常是指省略(不必要的)细节。相反的方向是具体化。在这种情况下也经常使用泛化,基本上与抽象的意思相同。

在计算机科学的背景下,这可以用来描述几个想法:

  • 一个是领域概念的建模。如 the class Car is an abstraction of real world automobiles. It uses an engine and four wheels to transport 1-5 people. 中所示,显然这与描述真实汽车的信息密度相去甚远,但这很可能是此应用程序上下文所需的全部。

  • 另一种是用它来描述多个领域实体之间的概念关系:A Car is a Motorvehicle. A Bus is also a Motorvehicle. Both are used to transport people.Motorvehicle是Car和Bus两者的抽象。它描述了运送人的想法,同时省略了多少细节。

  • 第三个是接口和实现之间的区别。该接口通过隐藏实现细节并仅表示可以交互的表面区域来抽象实现。


继承是在代码中实现抽象的一种方法。它描述了采用基础 class(这是更一般或抽象的东西)、继承其所有 features/properties/behavior/meaning 并添加更多细节(或覆盖某些现有细节)以创建派生的过程class(这是更具体的事情)。