我在任何地方都找不到这个问题。根据我的理解,继承应该/可能是抽象的子集。
答案 0 :(得分:1)
首先您应该意识到,在解释这些术语和概念时总会有一些余地。下面是我的看法。
抽象是概念,而继承是技术实现。
抽象一般是指省略(不必要的)细节。相反的方向是具体化。泛化也经常在这种情况下使用,基本上意味着与抽象相同。
在计算机科学的背景下,这可以用来描述几个想法:
一个是领域概念的建模。就像在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.
机动车是Car和Bus的抽象。它描述了运送人员的想法,同时省略了多少人的细节。
第三个是接口和实现之间的区别。该界面通过隐藏实现细节并仅表示可与之交互的表面积来抽象化实现。
继承是在代码中实现抽象的一种方法。它描述了获取基类(这是更通用或更抽象的东西),继承其所有功能/特性/行为/含义并添加更多详细信息(或覆盖现有的某些内容)以创建派生类的过程(这是更具体的事情。
答案 1 :(得分:0)
首先,将类标记为抽象时,无法创建实例。过去,抽象类只能被继承。
但是,当您从非抽象类继承时,可以从派生类和基类创建实例。因此,可以说抽象类用于生成新类型,要被继承而不创建实例!
这也是某种程度上与多态有关的。
例如,您有一个基本的Employee类,如下所示: 公共班级员工
{
public string Name { get; set; }
public double Salary { get; set; }
public void IncreaseSalary(double rate)
{
this.Salary += (this.Salary * rate / 100);
}
}
现在,当我们创建如下所示的SalesRepresentative类时,我们应该从Employee继承它,因为SalesRepresentative是Employee。 公共类SalesRepresentative:员工
{
public double AnnualSalesAmount { get; set; }
}
现在SalesRepresentative
对象具有IncreaseSalary
方法,因为它是从Employee继承的。但是通常情况下,销售代表和员工的薪水会根据他们的AnnualSalesAmount等以不同的方式提高。
在这种情况下,您应该可以从SalesRepresentative更改GrowthSalary的方法代码,但不能。实际上,您现在已经了解了多态性
现在,让我们开始抽象。如果要从继承的类中更改默认代码IncreaseSalary,则有两种选择。首先将方法标记为虚拟。第二个将其标记为抽象。
不同之处在于,如果将其标记为虚拟。您不必在SalesRepresentative
中实现它,但是如果将其标记为抽象,则必须实现它,并且应该忘记抽象成员只能位于抽象类中。检查以下示例:
public abstract class Employee
{
public string Name { get; set; }
public double Salary { get; set; }
public abstract void IncreaseSalary(double rate);
}
公共类SalesRepresentative:员工
{
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);
}
}
}