我正在努力了解Java中Abstraction的整体用法。
我一直在研究此链接中的一个示例:https://javatutorial.net/java-abstraction-example 我了解它的实现,但我不明白为什么它甚至是必要的。如果要在两个子类中再次创建它们,为什么要在Employee类中创建他们的validateSalary方法?
答案 0 :(得分:3)
抽象的整体用途是去耦。要使用Employee
,不需要知道实现,只需要知道接口及其协定即可。例如,这用于Collections.sort(List<T> list)
:Collections.sort(...)
的程序员无需知道特定列表的实现即可对其进行排序。这样做的好处是,实现支持符合List
interface的将来代码。 This question在这方面是相关的(#selfPromotion)。更少的耦合会导致更少的摩擦和总体上更少的易碎代码。
也就是说,您提供的示例是一个糟糕的示例,因为它违反了Single Responsibility Principle:Employee
实例没有责任计算工资。为此,您应该有一个单独的对象,该对象根据一个Employee
实例和一些工作时间来计算工资。在内部,此Uber计算器可以使用Chain of Responsibility,每个Calculator
的实施情况下,每个Employee
持有一个Employee
,将FullTimeEmployee
与她/他的工资计算方式脱钩。这提供了可扩展性和灵活性的额外好处:如果工资的计算方式发生了变化(例如,公司更改了政策,以便每个FullTimeEmployee
都获得相同的工资,或者公司希望通过周而不是按月),使用public class rotate : MonoBehaviour
{
public float speed;
Vector2 pos;
private void Start()
{
speed = 100;
}
private void Update()
{
if (Input.touchCount > 0)
{
Touch touch = Input.GetTouch(0);
Vector2 posInScreen = touch.position;
if (Camera.current.ScreenToWorldPoint(posInScreen) != null)
{
pos = Camera.current.ScreenToWorldPoint(posInScreen);
}
float Xposition = pos.x;
transform.rotation = Quaternion.Euler(0, 0, Xposition*speed);
}
}
}
的其他服务则不受影响)。