接口(interface)的原因真的让我难以理解。据我了解,这是一种解决 C# 中不存在的不存在的多重继承的方法(或者有人告诉我)。
我所看到的是,您预定义了一些成员和函数,然后必须在类中再次重新定义它们。从而使接口(interface)冗余。感觉就像句法……好吧,对我来说是垃圾(请不要冒犯我。垃圾就是无用的东西)。
在下面给出的示例中,取自堆栈溢出时的不同 C# 接口(interface)线程,我将只创建一个名为 Pizza 的基类而不是接口(interface)。
简单示例(取自不同的堆栈溢出贡献)
public interface IPizza
{
public void Order();
}
public class PepperoniPizza : IPizza
{
public void Order()
{
//Order Pepperoni pizza
}
}
public class HawaiiPizza : IPizza
{
public void Order()
{
//Order HawaiiPizza
}
}
最佳答案
没有人真正用通俗易懂的语言解释接口(interface)的用途,所以我要试一试(并从 Shamim 的回答中借鉴一点想法)。
让我们以披萨订购服务为例。您可以有多种类型的比萨饼,每个比萨饼的共同操作是在系统中准备订单。每个披萨都必须准备好,但每个披萨的准备方式都不同。例如,当订购夹馅披萨时,系统可能必须验证餐厅是否提供某些食材,并将那些不需要深盘披萨的食材放在一边。
当用代码编写时,技术上你可以这样做
public class Pizza
{
public void Prepare(PizzaType tp)
{
switch (tp)
{
case PizzaType.StuffedCrust:
// prepare stuffed crust ingredients in system
break;
case PizzaType.DeepDish:
// prepare deep dish ingredients in system
break;
//.... etc.
}
}
}
但是,深盘比萨(在 C# 术语中)可能需要在 Prepare()
方法中设置不同于馅饼皮的属性,因此您最终会得到很多可选属性,并且该类不能很好地扩展(如果您添加新的披萨类型会怎样)。
解决这个问题的正确方法是使用接口(interface)。该接口(interface)声明可以准备所有 Pizza,但可以准备不同的 Pizza。所以如果你有以下接口(interface):
public interface IPizza
{
void Prepare();
}
public class StuffedCrustPizza : IPizza
{
public void Prepare()
{
// Set settings in system for stuffed crust preparations
}
}
public class DeepDishPizza : IPizza
{
public void Prepare()
{
// Set settings in system for deep dish preparations
}
}
现在,您的订单处理代码无需准确了解订购的比萨饼类型即可处理配料。它只有:
public PreparePizzas(IList<IPizza> pizzas)
{
foreach (IPizza pizza in pizzas)
pizza.Prepare();
}
即使每种披萨的准备方式不同,这部分代码也不必关心我们处理的是什么类型的披萨,它只知道为披萨调用它,因此每次调用 Prepare
将根据其类型自动正确准备每个比萨,即使集合中有多种类型的比萨。
关于c# - 接口(interface)——有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6802573/