0

抽象类与接口是一样的,只是它是一个实际的类,而不仅仅是一个契约。为什么接口被称为契约?

4

2 回答 2

1

接口和抽象类都是契约,因为它们绑定了你。

但是接口和抽象类之间还有其他区别。

就像您说的那样,如果您需要一个实际的类,其中包含函数的内容或具有默认值的实际数据成员,或者一个 ctor,那么显然您将需要一个抽象类。

但很多时候,在接口或抽象类之间进行选择在技术上是相同的。有时即使从长远来看,情况也是如此。

那么你的决定应该基于你正在寻找的东西的性质。

它是您的数据类型的额外字符吗?还是它定义了您的数据类型什么?

我试图想出任何现实世界的例子,但我找不到任何例子,因为我多年来没有对这个主题做过任何事情,所以我会给你一个类似书本的例子。

假设我们有一个抽象类 Animal:

public abstract class Animal
{
    abstract string Name;
    abstract bool IsWild;
    abstract bool IsHappy;
}

这很容易成为一个界面。

并且选择它作为界面实际上不会对您的设计产生任何负面影响。

但就它的性质而言,它必须是一个抽象类,因为class Dog 它是一种动物。它必须是class Dog : Animal而不是class Dog : IAnimal

作为动物并不是Dog. 它定义了它。

并且您希望限制所有动物仅继承自Animal.

IAnimal让某人继承其他东西。喜欢:

public class Dog : Food, IAnimal {}

有趣的是,有时人们可能会写一个什么都没有的抽象类,只是为了同一件事。

例如,如果没有任何共同财产,Animal您仍然愿意这样做:

public abstract class Animal { }

public class Dog : Animal // No actual added value.
{ 
        .........
}
于 2012-08-19T13:55:20.973 回答
0

抽象类与接口是同一回事 不正确。接口不定义方法体、私有方法、静态字段/方法等。

抽象方法可以是私有的,因此不能保证外部世界可以访问,接口实现有义务公开接口的方法,因此“保证”这些方法的存在和可访问性,因此术语合同。

于 2012-08-19T13:43:59.300 回答