0

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

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

先谢谢了。

4

3 回答 3

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),但我们还设法节省了一些代码。

于 2012-05-10T12:28:37.810 回答
0

我不能直接给你一个实际的例子,但让我用小例子来解释两者之间的根本区别:

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

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

Avehicle可以是 and 的抽象类carboat如果您只想实例化实际的汽车和船只。车辆可以有一个 maximumSpeed字段,然后继承该字段。接口不能定义该字段。

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

最后,一个类可以实现多个接口。另一个显示差异的示例,如果您可以在现实生活中描绘您的对象,请考虑如何与它进行交互。假设一个咖啡机,它有一个开/关按钮。“抽象咖啡机”并没有真正的意义。所有你需要知道的是有一个setOn()setOff()方法。

于 2012-05-10T10:28:53.930 回答
0

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

在“现实生活”示例中,计算出有 2 个类,Person 和 Mones(我的昵称:D)和 1 个接口,IGuitarPlayer。因此,Mones 继承自 Person,如果 Mones 有弹吉他的能力,它就实现了 IGuitarPlayer 接口。

于 2012-05-10T10:44:03.610 回答