首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在哪里使用抽象类,在哪里使用接口?

在哪里使用抽象类,在哪里使用接口?
EN

Stack Overflow用户
提问于 2012-05-10 18:20:13
回答 3查看 980关注 0票数 0

我是一个asp.net程序员,我读过关于抽象类和接口的文章,我知道如何实现它,有没有人能给我解释一下,比如通过引用项目场景,在哪里可以使用抽象类,在哪里可以使用接口?

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

在进阶时谢谢。

EN

回答 3

Stack Overflow用户

发布于 2012-05-10 18:28:54

我不能直接给你一个实际的例子,但让我用一些小例子来解释这两种东西之间的基本差异

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

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

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

当你只需要一个方法的时候,你应该使用接口。假设您正在编写一个与这些车辆(“驾驶它们”)交互的程序,但是并不关心这些对象的状态,您可以使用一个方法vehicle来定义一个接口vehicle,这样该程序就可以驾驶所有的船和车,而不需要知道它们到底是什么。

最后,一个类可以实现多个接口。另一个展示不同之处的例子是,如果你可以在现实生活中描绘你的对象,想想你将如何与它交互。假设有一个咖啡机,它有一个开/关按钮。一台“抽象的咖啡机”没有真正的意义。您所需要知道的就是有一个setOn()setOff()方法。

票数 0
EN

Stack Overflow用户

发布于 2012-05-10 18:44:04

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

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

票数 0
EN

Stack Overflow用户

发布于 2012-05-10 20:28:38

由于项目中的示例依赖于域,您必须首先了解域才能理解示例,因此我将使用一个烹饪示例对其进行抽象。

假设我们想要能够用不同的酱料来做意大利面:我们想在源代码中独立于它的酱料来处理意大利面。第一种方法可以是使用Cook方法定义一个接口IPasta:

代码语言:javascript
复制
public interface IPasta
{
    void Cook();
}

然后我们的客户端代码可以独立于它的实现来烹调意大利面:番茄酱,香菜酱?只要你能想到,我们就能做出来:

代码语言:javascript
复制
...
IPasta pasta = GetPasta();
pasta.Cook();
...

然而,仔细考虑这个问题,我们发现烹调意大利面的过程总是相同的,除了我们想要准备调味汁的那一点。

这意味着我们有一个意大利面的基本算法,我们可以独立于任何酱汁实现:烧水,准备酱汁,从锅中取出意大利面并将其与酱汁合并。

代码语言:javascript
复制
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
    }
}

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

代码语言:javascript
复制
...
Pasta pasta = GetPasta();
pasta.Cook();
...

所以我们仍然有一个接口,不是C#意义上的,而是一个众所周知的公共行为(抽象类的公共方法库克)的通用意义上的接口,但我们也设法节省了一些代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10531989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档