如果问题太简单或太复杂,我是一个 Java 菜鸟,请原谅我,但我一直在阅读我的 Java 书,在第一章中我们介绍了继承,后来我们来到了接口。
我的问题是:什么时候使用接口合适,什么时候覆盖方法合适?
既然我们已经有了覆盖功能,为什么还需要接口呢?
如果问题太简单或太复杂,我是一个 Java 菜鸟,请原谅我,但我一直在阅读我的 Java 书,在第一章中我们介绍了继承,后来我们来到了接口。
我的问题是:什么时候使用接口合适,什么时候覆盖方法合适?
既然我们已经有了覆盖功能,为什么还需要接口呢?
可以这样想:考虑一个 Car 类,作为 Pickup、MiniVan 和 SUV 等多个类的基础,您可以在其中覆盖 Car- 方法。
到目前为止,一切都很好。
但就像在现实生活中一样,汽车不仅仅是汽车。例如,它也是一个身体。因此,根据您的应用程序,您需要将飞机、汽车以及其他一些东西视为物理实体,它们都有一些共同点,例如:
double getMass();
double getVelocity();
同时,汽车不仅仅是一个实体,更是一种家庭资产。例如,它可能与贷款相关联。因此,您可能希望支持以下方法:
Loan getLoan();
因此,接口可以用来为不同类的对象提供某些视图,就好像这些对象具有相同的类型一样。
接口提供了类应该实现的某种契约。假设您有一个名为 的接口Car
,它有一个accelerate()
方法。这里没有实现。
现在,你想要一些真正的用法Car
,所以你创建了一个实现方法的SubaruCar
类。 accelerate()
现在,例如,如果您需要一个SubaruImpreza
类,它可能会SportCar
使用继承和关键字进行扩展extends
。在这个类中,你重写 accelerate()
方法(因为它会比平常更快地加速SubaruCar
)
网络上充满了有关此问题的文档,但是如果我尝试用简单的英语对其进行总结,则比:
接口——就像一个合同,上面写着“我可以提供这个功能”。接口示例:Comparable
这意味着任何可比较的对象都可以提供比较的功能
Overreid - 当您使用 inharitance 并希望某些功能对子类采取不同的行为时。
这是两个不同的问题,一开始可能会令人困惑
这里的其他人提出了很好的观点,但让我提供一个稍微不同的观点。
如果您具有对象之间常见的行为(不是代码或特征,而是实际行为),请考虑在方法中具有一些已建立行为的抽象类(可能已声明final
)。但小心点。查看Circle-Ellipse 问题,了解为什么 Circle 可能不应该从 Ellipse 继承,即使这看起来很明显。
你只能扩展一个类,所以让它成为一个好的类。请记住,好的软件设计是尽可能松散地耦合您的代码。换句话说,尽可能确保更改一个类中的代码不涉及更改一堆其他类中的代码。这就是为什么周末加班的原因。没有比继承更紧密的耦合了,所以要明智地选择。向基类添加新行为意味着每个派生类也都会获得它,这可能会导致很多尴尬的问题(例如,通过实现一个空方法来满足合同要求)。
最后,扩展多个接口的能力允许客户端代码根据不同的 API 协定对对象进行不同的处理,因此我可以将Person
对象视为Doctor
代码的一部分和代码的Father
另一部分。但不要搞错,这不是多重继承。
最后,这取决于您的领域、更改基类的可能性以及您将学会用经验衡量的其他因素。不过,在所有条件相同的情况下,更喜欢接口而不是继承。
等到你学习了 Ruby 和 Scala,你就可以了解模块和特征。然后它变得非常有趣。
希望有帮助。