【问题标题】:Difference between abstract Class and Interface in C# [duplicate]C#中抽象类和接口之间的区别[重复]
【发布时间】:2015-02-28 09:50:04
【问题描述】:

这篇文章说 Codeproject 抽象类 - 可以有方法声明和方法定义。

但是这篇文章说 programcall 摘要 - 只能有方法声明。

我很困惑。谁能帮我弄清楚两者的确切区别是什么?

【问题讨论】:

标签: c# oop


【解决方案1】:

看到这个article

多重继承

一个类可以继承多个接口。

一个类只能继承一个抽象类。

默认实现

接口不能提供任何代码,只能提供签名。

抽象类可以提供完整的默认代码和/或仅提供必须覆盖的细节。

访问修饰符

接口不能有子类、函数、属性等的访问修饰符,一切都假定为公共抽象类可以包含子类、函数、属性的访问修饰符 核心 VS 外设

接口用于定义类的外围能力。换句话说,Human 和 Vehicle 都可以从 IMovable 接口继承。

抽象类定义了一个类的核心标识,并用于相同类型的对象。

同质化

如果各种实现只共享方法签名,那么最好使用接口。

如果各种实现是同类并使用共同的行为或状态,那么最好使用抽象类。

添加功能(版本控制)

如果我们向接口添加新方法,那么我们必须跟踪接口的所有实现并为新方法定义实现。

如果我们向抽象类添加新方法,那么我们可以选择提供默认实现,因此所有现有代码都可以正常工作。

字段和常量 接口中不能定义字段 抽象类可以定义字段和常量

【讨论】:

  • 一个类不从接口继承,它实现了它。 C# 中没有多重继承。
  • @DarrenYoung 是的
  • 抽象方法可以在抽象类中有代码定义吗? @Shahrooz
  • @King_Fisher 没有。但是你可以使用虚拟方法,然后在子类中覆盖它
【解决方案2】:

据我所知,抽象类已经可以实现一些方法或变量的值,只要它不实现它们all(这将使其成为正常的班级)。 接口无法做到这一点;它只能提供方法和变量存根。

【讨论】:

    【解决方案3】:

    接口更像是一种契约——它详细说明了将在实现它的对象上找到哪些方法或属性。

    抽象类是一个基础对象——它可以包含方法、变量和行为——但是你不能创建它的具体实现——你必须从它继承并扩展它的行为。

    【讨论】:

    • 不是“可以找到”——而是“找到”。
    猜你喜欢
    • 2011-04-07
    • 2014-05-16
    • 2014-01-20
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 2011-01-01
    • 2013-03-29
    • 1970-01-01
    相关资源
    最近更新 更多