【问题标题】:What is the difference between Abstraction and Inheritance?抽象和继承有什么区别?
【发布时间】:2019-08-03 07:38:55
【问题描述】:

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

【问题讨论】:

  • 第一种情况下的抽象和第二种情况下的抽象指的是不同的概念。第一个是指编程中的“概念”,第二个是具有特定属性的特定类,因此“抽象与继承是一个意义不大或没有意义的问题。
  • @GianPaolo 正在寻找这两个概念之间的区别。为什么它几乎没有意义?
  • 一个原始(而且非常糟糕)的例子:就像你在问 我可以找到关于“活着”和“死”之间的区别以及“客厅”和“餐厅”,但我不明白“住”和“餐厅”的区别(对不起,英语不是我的母语,找不到更合适的例子)
  • @GianPaolo 这很有趣但无效(抽象和继承都是糟糕的概念,就像客厅和餐厅一样)
  • 我之前的评论指的是之前版本的问题

标签: c# oop inheritance abstraction


【解决方案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. Motorvehicle 是 Car 和 Bus 的抽象。它描述了运送人的想法,但省略了多少人的细节。

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


继承是在代码中实现抽象的一种方法。它描述了获取基类(这是更通用或抽象的东西)、继承其所有特性/属性/行为/含义并添加更多细节(或覆盖一些现有的)以创建派生类的过程(这是更具体的事情)。

【讨论】:

    【解决方案2】:

    首先,当您将类标记为抽象时,您无法创建实例。抽象类只能被继承。

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

    这也是某种相关的多态性。

    例如,您有一个基本的 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 继承的。但一般来说,销售代表和员工的工资会以不同的方式增加,例如根据他们的年销售额。

    在这种情况下,您应该能够从 SalesRepresentative 更改 increaseSalary 的方法代码,但您不能。其实现在你已经接触到多态了

    现在让我们来抽象一下。如果你想从继承的类中改变默认的IncreaseSalary代码,有两种选择。首先将方法标记为虚拟。第二个是将其标记为抽象。

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

    public abstract class Employee
    
    {
       public string Name { get; set; }
       public double Salary { get; set; }
    
       public abstract void IncreaseSalary(double rate);
    
    }
    

    公共类 SalesRepresentative : Employee

    {
        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);
            }
        }
    }
    

    【讨论】:

    • 感谢您的回答,您是说如果我继承自基类(不是抽象的),那么它就不是抽象。
    • 当您从非抽象类继承时,您可以从派生类和基类创建实例。所以你也可以说抽象类是用来生成新类型的,被继承而不是创建实例。
    • 另外,每个抽象类都是一个基类。必须如此,因为没有在抽象类中定义的函数,必须在派生类中定义。 ...只有在使用接口时,该类才能实现多个基类。
    • 没关系,但是继承和抽象有什么区别呢?
    • 伙计,这只是上面的区别,在哪个例子中也有你读过那里的完全区别,基本区别是:继承和抽象:Java接口可以使用关键字“implements”来实现”和抽象类可以使用关键字“extends”进行扩展。多重实现:一个接口只能扩展另一个Java接口,一个抽象类可以扩展另一个Java类并实现多个Java接口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 2015-08-03
    • 2016-08-12
    • 1970-01-01
    相关资源
    最近更新 更多