【发布时间】:2013-06-22 00:40:31
【问题描述】:
OOP 接口。
【问题讨论】:
-
当你的标题比你的问题的内容长,那么它可能不是一个很好的问题。你想要好的答案,请提供一个好的问题。
-
相关讨论见this old quesion
OOP 接口。
【问题讨论】:
根据我自己的经验,当涉及到与多个开发人员一起设计和实现多个互操作模块时,我发现接口非常有用。例如,如果有两个开发人员,一个在后端工作,另一个在前端 (UI) 工作,那么一旦他们完成接口,他们就可以开始并行工作。因此,如果每个人都遵循定义的合同,那么以后的集成就变得轻松了。而这正是接口所做的——定义契约!
基本上它避免这种情况:
【讨论】:
当您需要一个类对子类实现的泛型方法进行操作时,接口非常有用。
public class Person
{
public void Eat(IFruit fruit)
{
Console.WriteLine("The {0} is delicious!",fruit.Name);
}
}
public interface IFruit
{
string Name { get; }
}
public class Apple : IFruit
{
public string Name
{
get { return "Apple"; }
}
}
public class Strawberry : IFruit
{
public string Name
{
get { return "Strawberry"; }
}
}
【讨论】:
在多重继承的情况下,接口非常有用。
【讨论】:
编程语言(C#、java)
这些语言不支持类的多重继承,但是,它们支持接口的多重继承;这是界面的另一个优点。
【讨论】:
基本上,接口允许程序更改实现,而不必告诉所有客户端他们现在需要“Bar”对象而不是“Foo”对象。它告诉这个类的用户它做了什么,而不是它是什么。
例子:
您编写的一个方法想要遍历给它的值。现在有几个东西可以迭代,比如列表、数组和集合。
如果没有接口,您将不得不编写:
public class Foo<T>
{
public void DoSomething(T items[])
{
}
public void DoSomething(List<T> items)
{
}
public void DoSomething(SomeCollectionType<T> items)
{
}
}
对于每个新的可迭代类型,您都必须添加另一个方法,否则您的类的用户将不得不转换他的数据。例如,对于这个解决方案,如果他有一个 FooCollectionType 的集合,他必须将其转换为 Array、List 或 SomeOtherCollectionType。
有了你只需要的接口:
public class Foo<T>
{
public void DoSomething(IEnumerable<T> items)
{
}
}
这意味着你的类只需要知道用户传递给它的任何东西都可以被迭代。如果用户将他的 SomeCollectionType 更改为 AnotherCollectionType,则他不必强制转换或更改您的类。
请注意,抽象基类允许相同类型的抽象,但在用法上有一些细微差别。
【讨论】: