在哪里使用抽象类和在哪里使用接口?

时间:2012-05-10 10:20:13

标签: asp.net oop

我是asp.net programmer.i已经阅读了抽象类和接口的文章,我也知道如何实现它。但是任何人都可以解释我实际上,即通过引用项目场景在哪里使用抽象类和在哪里使用接口?

我需要一个非常实用或真实的世界项目示例,以便我可以非常有效地在我的项目中实现它?

先谢谢了。

3 个答案:

答案 0 :(得分:0)

我不能直截了当地给你一个实际的例子,但让我用小例子解释两者之间的基本差异

抽象类是类的层次结构的一部分。这意味着它们用于继承。接口与继承无关。抽象类意味着您无法实例化它,并且所有成员(字段方法构造函数)都由子类继承。界面只能定义要实施的方法

你应该使用一个抽象类,你有一个有意义的层次结构:

vehicle可以是carboat的抽象类,如果您只想要实例化汽车和船只。车辆可以具有maximumSpeed字段,然后继承该字段。接口无法定义此字段。

当您只需要方法时,使用界面。假设您正在编写一个与这些工具交互的程序(“驱动它们”),但不关心这些对象的状态,您可以定义一个接口{{ 1}}使用方法vehicle,以便程序可以驱动所有船只和汽车,而不知道它们到底是什么。

最后,一个类可以实现多个接口。另一个展示差异的例子,如果你可以在现实生活中描绘你的物体,想想你将如何与它互动。假设一个咖啡机,它有一个开/关按钮。 “抽象咖啡机”并没有真正意义。您需要知道的是,有drive()setOn()方法。

答案 1 :(得分:0)

我个人喜欢在必须定义对象的特征或能力时使用接口,而不管对象是什么。

在一个“现实生活”的例子中,想出了2个类,Person和Mones(我的昵称:D),以及1个界面,IGuitarPlayer。 因此,Mones继承自Person,如果Mones能够弹奏吉他,它会实现IGuitarPlayer界面。

答案 2 :(得分:0)

由于项目中的示例取决于域,您必须首先理解该示例,我将使用烹饪示例对其进行抽象。

假设我们希望能够烹制不同酱料的意大利面:我们希望在源代码中独立于酱汁处理意大利面。第一种方法可以是使用Cook方法定义接口IPasta:

public interface IPasta
{
    void Cook();
}

我们的客户代码可以独立地烹制面食:番茄酱,香蒜酱?你说出来,我们可以做饭:

...
IPasta pasta = GetPasta();
pasta.Cook();
...

但是,仔细考虑这个问题,我们发现烹饪面食总是一样的,不包括我们想要准备酱汁的地方。

这意味着我们有面食的基本算法,我们可以独立于任何酱汁实施:煮沸水,准备酱汁,将面食从锅中取出并将其与酱汁混合

public abstract class Pasta
{
    public void Cook()
    {
        BoilWater();
        PrepareSauce();
        ...
    }

    protected abstract void PrepareSauce();

    private void BoilWater()
    {
        // Boil some water
    }
}

public class PastaWithPestoSauce
{
    protected override void PrepareSauce()
    {
        // Prepare pesto sauce
    }
}

我们的客户会像这样使用它:

...
Pasta pasta = GetPasta();
pasta.Cook();
...

所以我们仍然有一个接口,不是在C#意义上,而是在众所周知的公共行为(抽象类的公共方法Cook)的一般意义上,但我们还设法省去了一些代码。