我是一个asp.net程序员,我读过关于抽象类和接口的文章,我知道如何实现它,有没有人能给我解释一下,比如通过引用项目场景,在哪里可以使用抽象类,在哪里可以使用接口?
我需要一个非常实用或真实的项目示例,这样我就可以在我的项目中非常有效地实现它?
在进阶时谢谢。
发布于 2012-05-10 18:28:54
我不能直接给你一个实际的例子,但让我用一些小例子来解释这两种东西之间的基本差异:
抽象类是类的分层结构的一部分。这意味着它们被用于继承。接口与继承无关。抽象类意味着您不能实例化它,并且所有成员(字段、方法和构造函数)都由子类继承。接口只能定义要实现的方法。
您应该使用一个抽象类,其中您有一个有意义的层次结构:
如果您只想实例化实际的汽车和船只,那么vehicle可以是car和boat的抽象类。车辆可以有一个maximumSpeed字段,然后继承该字段。接口不能定义此字段。
当你只需要一个方法的时候,你应该使用接口。假设您正在编写一个与这些车辆(“驾驶它们”)交互的程序,但是并不关心这些对象的状态,您可以使用一个方法vehicle来定义一个接口vehicle,这样该程序就可以驾驶所有的船和车,而不需要知道它们到底是什么。
最后,一个类可以实现多个接口。另一个展示不同之处的例子是,如果你可以在现实生活中描绘你的对象,想想你将如何与它交互。假设有一个咖啡机,它有一个开/关按钮。一台“抽象的咖啡机”没有真正的意义。您所需要知道的就是有一个setOn()和setOff()方法。
发布于 2012-05-10 18:44:04
就我个人而言,当我必须定义对象的特征或能力时,我喜欢使用接口,而不管对象是什么。
在一个“现实生活”示例中,计算出有两个类,Person和Mones (我的昵称:D),以及一个接口,IGuitarPlayer。因此,Mones继承自Person,如果Mones具有弹吉他的能力,它将实现IGuitarPlayer接口。
发布于 2012-05-10 20:28:38
由于项目中的示例依赖于域,您必须首先了解域才能理解示例,因此我将使用一个烹饪示例对其进行抽象。
假设我们想要能够用不同的酱料来做意大利面:我们想在源代码中独立于它的酱料来处理意大利面。第一种方法可以是使用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#意义上的,而是一个众所周知的公共行为(抽象类的公共方法库克)的通用意义上的接口,但我们也设法节省了一些代码。
https://stackoverflow.com/questions/10531989
复制相似问题