▷ java - 为什么要使用继承?

接口只定义对象可以做什么而不是如何做。所以简单来说,接口就是合约。所有实现接口的对象都必须定义自己的合约实现。在实际世界中,这给了你separation of concern. 想象一下自己编写的应用程序需要处理您事先不知道的各种对象,但您仍然需要处理它们,您只知道这些对象应该做什么不同的事情。因此,您将定义一个接口并在合同中提及所有操作。现在您将针对该接口编写应用程序。以后任何想要利用您的代码或应用程序的人都必须在对象上实现接口以使其与您的系统一起使用。您的界面将强制他们的对象定义合同中定义的每个操作应该如何完成。这样,任何人都可以编写实现您的接口的对象,以使它们完美地适应您的系统,而您所知道的只是需要做什么,而需要定义如何完成的是对象。
在实际开发中,这种做法通常被称为
Programming to Interface and not
to Implementation.
接口只是合同或签名,它们对实现一无所知。
针对接口进行编码意味着,客户端代码始终持有一个由工厂提供的接口对象。工厂返回的任何实例都是任何工厂候选类必须实现的接口类型。这样客户端程序就不用担心实现了,接口签名决定了所有操作可以做什么。这可以用来改变程序在运行时的行为。从维护的角度来看,它还可以帮助您编写更好的程序。
这是一个基本的例子。
public enum Language
{
English, German, Spanish
}
public class SpeakerFactory
{
public static ISpeaker CreateSpeaker(Language language)
{
switch (language)
{
case Language.English:
return new EnglishSpeaker();
case Language.German:
return new GermanSpeaker();
case Language.Spanish:
return new SpanishSpeaker();
default:
throw new ApplicationException("No speaker can speak such language");
}
}
}
[STAThread]
static void Main()
{
//This is your client code.
ISpeaker speaker = SpeakerFactory.CreateSpeaker(Language.English);
speaker.Speak();
Console.ReadLine();
}
public interface ISpeaker
{
void Speak();
}
public class EnglishSpeaker : ISpeaker
{
public EnglishSpeaker() { }
#region ISpeaker Members
public void Speak()
{
Console.WriteLine("I speak English.");
}
#endregion
}
public class GermanSpeaker : ISpeaker
{
public GermanSpeaker() { }
#region ISpeaker Members
public void Speak()
{
Console.WriteLine("I speak German.");
}
#endregion
}
public class SpanishSpeaker : ISpeaker
{
public SpanishSpeaker() { }
#region ISpeaker Members
public void Speak()
{
Console.WriteLine("I speak Spanish.");
}
#endregion
}
替代文字 http://ruchitsurati.net/myfiles/interface.png