When to use interfaces from an oop pov
我学到了很多关于如何构造代码的知识。例如,名词翻译成类(例如,类狗,类香蕉)。对象已转换为类内变量的内容。(例如,狗有一个名字,所以名字在狗类中是一个变量。)我也被教导抽象名词可以翻译成抽象类,例如,棋子是一个抽象类,国王、兵等可以从中继承。
接口是如何这样工作的?我从来没有发现自己在使用接口,我想这样做是因为我听说你应该设计一个接口。
接口"像这样工作",这样它们就可以强制执行要在其实现者之间满足的契约。界面上说:"你应该这样做"。因此,以你的例子为例,你可能会通过观察
1 2 3 4 | public interface GamePiece { void move(int x, int y); // more behaviors here } |
还有你抽象的棋子类……
1 2 3 4 5 6 | public abstract class ChessPiece implements GamePiece { // could add more shared stuff here public abstract void move(int x, int y); // other stuff can be implemented if needed } |
国王会延长…
1 2 3 4 5 6 7 | public class King extends ChessPiece { @Override public void move(int x, int y) { // move as the King does } } |
但你也可以将这个契约应用到其他游戏中。也许你想要一个糖果…
1 2 3 4 5 6 7 | public class CandyLandPiece implements GamePiece { @Override public void move(int x, int y) { // move as these pieces do } } |
表面上,接口非常类似于类,只是它们不能定义内部的方法。它留给实现类来定义它们看起来合适的方法。由于Java非常明智地不允许一个类从多个类继承(多重继承),所以一个类仍然可以实现多个接口来实现这一目标,并避免伴随多重继承的陷阱。因此,您可以在接口动物中有一个方法声音,并且实现这个接口的每个类都必须以自己的自定义方式定义方法声音。举个例子,
假设您有一个接口动物,它有一个makessound方法。
类狗实现动物还必须定义makeSound()//bark_
类Cow实现动物还必须定义makeSound()//moo
如果要为所有类实现相同的功能,最好扩展一个类,如果要为所有类使用相同名称的自定义功能,最好使用接口。通常,倾向于一个接口,因为它允许您在将来将类扩展到当前类。
我一般同意第一段。
论
How do interfaces work like this? I never find myself using interfaces and I want to because I heard that you should design towards an interface.
您可能还没有用Java处理大型项目。
接口正是它们的声音——定义两个Java模块可以与之通信的合同。抽象类是接口+功能定义。
我在考虑与外部模块通信时使用接口。它应该能够看到和使用您的界面,而且(可能)没有其他功能。
抽象类的存在是为了避免子类中的重复,但是,正如您所知道的,它们不能被实例化,因此它们缺少一些功能来作为类型的完整对象。
也许您应该提供一个可以在这里讨论的代码片段。
将接口视为协议。例如,一个板球和一个足球可以被认为是类。但他们遵循一个共同的协议,即"可反弹"。接口逻辑地将不同类层次结构的类组合在一起。
根据注释修改答案:可反弹接口可以有一个方法"反弹"。这反过来意味着实现可反弹接口的所有类都必须实现"反弹"。从逻辑上讲,这听起来也是正确的,每个可弹跳的球(无论是板球还是足球)都必须能够弹起。