对接口更简洁的定义
对接口的非常简短的解释。
引言
为初学者提供的关于接口的非常简短的解释。
背景
如果您是接口新手,那么您可能难以理解它们。 然而,一旦你理解了它,软件设计中将会开启一个全新的世界。 这是一个简短的教程,解释了它们为什么有用。
定义
与其使用正式的定义,不如用两个词来简单地描述接口:'群体行为'。
为什么接口有用?
从上面的定义可以看出,它们在以下两个方面很有用:
- 按共同行为对对象进行分组。
- 在一组对象上实现所需的行为。
例子
我们在2000年前的《米德拉什》中看到了这个原则的一个古老的例子。
在地球上,没有一片草叶没有一个在天上方的天使击打它并对它说:“生长!”
当然,宇宙之主也将是一位伟大的程序员
我们在这里看到,在我们的宇宙中,每种植物都有一个共同的行为,它们生长。“天使”函数遍历宇宙中每个可生长的对象并调用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 中非常重要。