抽象和继承有什么区别?
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(这是更具体的事情)。
我在任何地方都找不到这个问题。根据我的理解,继承 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(这是更具体的事情)。