language-agnostic - 是否应该从编程语言中删除(非接口(interface)类型的)继承?

标签 language-agnostic inheritance programming-languages language-features

这是一个颇具争议的话题,在你说“不”之前,真的、真的需要吗?

我已经编程了大约 10 年,老实说,我无法回想起继承解决无法以其他方式解决的问题的时间。另一方面,当我使用继承时,我可以记忆起很多次,因为我觉得我必须这样做,或者因为我认为我很聪明并最终为此付出了代价。

从实现的角度来看,我真的看不出任何不能使用聚合或其他技术来代替继承的情况。

我唯一需要注意的是,我们仍然允许接口(interface)继承。

(更新)

让我们举例说明为什么需要它,而不是说“有时它只是需要”。这真的一点帮助都没有。你的证据在哪里?

(更新 2 代码示例)

这是经典的形状示例,更强大,更明确的 IMO,没有继承。在现实世界中,几乎从来没有真正"is"其他东西的情况。几乎总是“在条款中实现”更准确。

public interface IShape
{
    void Draw();
}

public class BasicShape : IShape
{
    public void Draw()
    {
        // All shapes in this system have a dot in the middle except squares.
        DrawDotInMiddle();
    }
}

public class Circle : IShape
{
    private BasicShape _basicShape;

    public void Draw()
    {
        // Draw the circle part
        DrawCircle();
        _basicShape.Draw();
    }
}

public class Square : IShape
{
    private BasicShape _basicShape;

    public void Draw()
    {
        // Draw the circle part
        DrawSquare();
    }
}

最佳答案

不,有时您需要继承。对于那些你不使用它的时候——不要使用它。您始终可以“仅”使用接口(interface)(在具有它们的语言中)和没有数据的 ADP 就像在那些没有它们的语言中的接口(interface)一样工作。但是我认为没有理由仅仅因为您觉得它并不总是需要而删除有时是必要的功能。

关于language-agnostic - 是否应该从编程语言中删除(非接口(interface)类型的)继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/361371/

相关文章:

c# - 为什么我应该在继承中使用 protected 变量(成员/属性)?使用它有什么好处?

c++ - 在这种情况下如何使用动态多态性?

Java源代码依赖关系图

javascript - 'map' 的名称是什么 'expands' 而不是一对一

language-agnostic - 有没有使用工厂方法/模式来创建游戏对象/角色的好例子?

c# - 当派生类中的方法被调用时,基类是否有可能得到通知?

java - 为什么叫它 "method hiding"?

search - 我想找到一种具有通用名称的计算机语言

optimization - 如何在优化方面做得更好?

algorithm - 从 16 位值中逐行扫描位