มันเป็นความจริงหรือไม่ที่วิธีการที่เป็นรูปธรรมที่สำคัญคือกลิ่นรหัส? เพราะฉันคิดว่าถ้าคุณต้องการแทนที่วิธีที่เป็นรูปธรรม:
public class A{
public void a(){
}
}
public class B extends A{
@Override
public void a(){
}
}
มันสามารถเขียนใหม่เป็น
public interface A{
public void a();
}
public class ConcreteA implements A{
public void a();
}
public class B implements A{
public void a(){
}
}
และถ้า B ต้องการนำมาใช้ใหม่ () ใน A มันสามารถเขียนใหม่เป็น:
public class B implements A{
public ConcreteA concreteA;
public void a(){
concreteA.a();
}
}
ซึ่งไม่ต้องการการสืบทอดเพื่อแทนที่เมธอดเป็นจริงหรือไม่?
virtual
คำหลักเพื่อสนับสนุนการแทนที่ ดังนั้นปัญหานี้เกิดขึ้นมาก (หรือน้อยกว่า) คลุมเครือโดยรายละเอียดของภาษา
final
ตัวแก้ไขมีอยู่จริงสำหรับสถานการณ์เช่นนี้ final
หากลักษณะการทำงานของวิธีการที่เป็นเช่นนั้นมันไม่ได้ออกแบบมาเพื่อแทนที่แล้วทำเครื่องหมายว่า มิฉะนั้นคาดว่านักพัฒนาซอฟต์แวร์อาจเลือกที่จะแทนที่