65.9K
CodeProject 正在变化。 阅读更多。
Home

对接口更简洁的定义

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.82/5 (7投票s)

2013 年 1 月 18 日

CPOL

3分钟阅读

viewsIcon

7825

对接口的非常简短的解释。

引言

为初学者提供的关于接口的非常简短的解释。

背景 

如果您是接口新手,那么您可能难以理解它们。 然而,一旦你理解了它,软件设计中将会开启一个全新的世界。 这是一个简短的教程,解释了它们为什么有用。

定义

与其使用正式的定义,不如用两个词来简单地描述接口:'群体行为'。

为什么接口有用?

从上面的定义可以看出,它们在以下两个方面很有用:

  1. 按共同行为对对象进行分组。
  2. 在一组对象上实现所需的行为。

例子

我们在2000年前的《米德拉什》中看到了这个原则的一个古老的例子。

在地球上,没有一片草叶没有一个在天上方的天使击打它并对它说:“生长!”

当然,宇宙之主也将是一位伟大的程序员Smile | :)

我们在这里看到,在我们的宇宙中,每种植物都有一个共同的行为,它们生长。“天使”函数遍历宇宙中每个可生长的对象并调用Grow函数。 我们可以实现这个基本代码。

interface IGrowable
{
  Grow();
}    
List<IGrowable> plants = Universe.TypeOf<IGrowable>.ToList();
foreach (plant in plants)
{
  plant.Grow();
}  

这是一个好的编程习惯,每个实现IGrowable接口的对象必须定义它自己如何生长,因此我们可以调用Grow()并保证它有效。

现在你可能会问,为什么我们不能在我们的例子中使用一个普通的 Plant 对象? 好吧,不仅仅是植物在生长,还有动物、人、细菌、问题、漏洞、秃顶等等。 我们不能使用继承,因为这些对象彼此之间没有任何共同之处,除了它们都在生长。 因此,如果我们的植物生长天使也是秃顶生长天使,那么他仍然可以完成他的工作。 再说一次,也许是一个死亡天使正在遍历我的头发,告诉每一根头发死去?

重要的是,按行为分组使编码更容易。

一个更复杂的例子

我将扩展我对接口的非常简洁的定义,以展示它们有多么强大。 让我们使用访问者模式

房间里有一个女人和三个人; 医生、丈夫和一个无家可归的陌生人。 一个女人由身体部位组成,每个身体部位都可以是被触摸、爱抚或亲吻的组合,让我们这样说。

身体部位(类)
手臂
头发
眼睛
牙齿

ITouchable(接口)
手臂
头发
牙齿

IStrokeable(接口)
手臂
头发

IKissable(接口)
手臂

这些都是“被访问”的对象。 现在让我们定义我们的“访问者”对象。

Human(对象),IKisser, IStroker, IToucher(接口)
医生
丈夫
无家可归的陌生人

现在让我们构建这个模式

foreach (Human human in Room)
{
  foreach (ITouchable bodypart in Woman.BodyParts.TypeOf<ITouchable>())
{ 
  bodypart.TouchedBy(human); 
}  
 foreach (IStrokable bodypart in Woman.BodyParts.TypeOf<IStrokable>())
{ 
  bodypart.StrokedBy(human); 
}   
foreach (IKissable bodypart in Woman.BodyParts.TypeOf<IKissable>())
{ 
  bodypart.KissedBy(human); 
} 
} 

在这里,我们使用接口来分组通过“访问者”的不同行为操作,现在我们需要定义这些行为如何被访问者接收,即女人。

public class Arm : BodyPart, ITouchable, IStrokable, IKissable
{
  public void TouchedBy(IToucher toucher)
  {
  if (toucher is Doctor)
   {
{
    Console.WriteLine("Your hands are cold"); 
  } 
else if (toucher is Husband)
{    
 
  Console.WriteLine("Not now, I have a headache"); 
} 
else if (toucher is HomelessStranger) 
{
  Console.WriteLine("Please don't touch me,"); 
} 
} 
public void StrokedBy(IStroker stroker) 
{ 
if (stroker is Doctor)
{
  Console.WriteLine("What are you doing?"); 
} 
else if (stroker is Husband)
{
  Console.WriteLine("Not now, I have a headache"); 
} 
else if (stroker is HomelessStranger) 
{
  Console.WriteLine("Get off!"); 
}  
}
public void KissedBy(IKissable kisser)
{
 if (kisser is Doctor)
{
  Console.WriteLine("What the hell are you doing?!"); 
} 
else if (kisser is Husband)
{
  Console.WriteLine("Not now, I have a headache"); 
} 
else if (kisser is HomelessStranger) 
{
  Console.WriteLine("Police!!!!!"); 
}   
}  
}  

这种模式对于合规系统很有用,例如,您可以轻松地将检查系统与需要检查的对象分开,这很好。 您还可以看到在不破坏系统的情况下,添加另一个人到房间是多么容易。

结论 

接口允许我们根据组件彼此之间的行为来定义系统,这允许灵活性和健壮性,这在 OOP 中非常重要。

© . All rights reserved.