抽象有什么用?
What is the use of Abstraction?
我很难理解抽象在 Java 中的整体使用。
我一直在研究这个link中的一个例子:https://javatutorial.net/java-abstraction-example
我理解它的实现,但我不明白为什么它是必要的。为什么他们的 calculateSalary 方法是在 Employee class 中创建的,如果他们只是要在 2 subclasses 中再次创建?
整体使用抽象就是解耦。要使用 Employee
,不需要知道实现,只需要了解接口及其契约。例如,这用于 Collections.sort(List<T> list)
: the programmers of Collections.sort(...)
did not need to know the implementation of a specific list in order to sort it. This provides the benefit that the implementation support future code that conforms to the List
interface. 在这方面是相关的 (#selfPromotion)。更少的耦合导致更少的摩擦和整体更不脆弱的代码。
就是说,您提供的示例是一个糟糕的示例,因为它违反了 Single Responsibility Principle: It is not the responsibility of an Employee
instance to calculate the salary. For this, we should have a separate object that calculates the salary, based on an Employee
-instance and some hours worked. Internally, this Uber-calculator could use a Chain of Responsibility,每个 Employee
实现一个 Calculator
,解耦 Employee
从他们的工资是如何计算的。这提供了可扩展性和灵活性的额外好处:如果薪水的计算方式发生变化(例如,公司可能改变政策以便每个 FullTimeEmployee
赚取相同的薪水,或者公司可能希望按-week 而不是按月计算),其他使用 FullTimeEmployee
的服务表示不受影响)。
我很难理解抽象在 Java 中的整体使用。
我一直在研究这个link中的一个例子:https://javatutorial.net/java-abstraction-example 我理解它的实现,但我不明白为什么它是必要的。为什么他们的 calculateSalary 方法是在 Employee class 中创建的,如果他们只是要在 2 subclasses 中再次创建?
整体使用抽象就是解耦。要使用 Employee
,不需要知道实现,只需要了解接口及其契约。例如,这用于 Collections.sort(List<T> list)
: the programmers of Collections.sort(...)
did not need to know the implementation of a specific list in order to sort it. This provides the benefit that the implementation support future code that conforms to the List
interface.
就是说,您提供的示例是一个糟糕的示例,因为它违反了 Single Responsibility Principle: It is not the responsibility of an Employee
instance to calculate the salary. For this, we should have a separate object that calculates the salary, based on an Employee
-instance and some hours worked. Internally, this Uber-calculator could use a Chain of Responsibility,每个 Employee
实现一个 Calculator
,解耦 Employee
从他们的工资是如何计算的。这提供了可扩展性和灵活性的额外好处:如果薪水的计算方式发生变化(例如,公司可能改变政策以便每个 FullTimeEmployee
赚取相同的薪水,或者公司可能希望按-week 而不是按月计算),其他使用 FullTimeEmployee
的服务表示不受影响)。