我是asp.net programmer.i已经阅读了抽象类和接口的文章,我也知道如何实现它。但是任何人都可以解释我实际上,即通过引用项目场景在哪里使用抽象类和在哪里使用接口?
我需要一个非常实用或真实的世界项目示例,以便我可以非常有效地在我的项目中实现它?
先谢谢了。
答案 0 :(得分:0)
我不能直截了当地给你一个实际的例子,但让我用小例子解释两者之间的基本差异:
抽象类是类的层次结构的一部分。这意味着它们用于继承。接口与继承无关。抽象类意味着您无法实例化它,并且所有成员(字段,方法和构造函数)都由子类继承。界面只能定义要实施的方法。
你应该使用一个抽象类,你有一个有意义的层次结构:
vehicle
可以是car
和boat
的抽象类,如果您只想要实例化汽车和船只。车辆可以具有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)的一般意义上,但我们还设法省去了一些代码。