Tôi tiếp tục quay lại các biến thể của vấn đề này: có thể có một giải pháp rất đơn giản, nhưng tôi không thể tìm ra được ...Trả lại đối tượng lớp con từ phương thức siêu lớp
Tôi có một loạt các lớp của biểu mẫu xQuantity, ví dụ DistanceQuantity, AreaQuantity, vv, mở rộng một lớp DimensionQuantity. Bây giờ bạn có thể cộng hoặc trừ DistanceQuantity hoặc AreaQuantity, vv, nhưng bạn không thể trộn chúng, vì vậy tôi nghĩ rằng tôi cần phải có (ngắn) cộng, trừ, vv, các phương thức trong các lớp con, nhưng tôi muốn giảm bớt bất kỳ logic nào sao chép ở mức tối thiểu. Tuy nhiên, tôi cần trả về một đối tượng của lớp con, và điều này có vẻ khó thực hiện từ phương thức superclass. Tôi tin rằng điều này có thể được thực hiện bằng cách sử dụng sự phản chiếu, nhưng AFAIK bạn vẫn cần phải làm một diễn viên ở cuối trong phương pháp lớp con, và tôi nói rằng phản ánh có thể tốn kém ... Điều tốt nhất tôi đã đưa ra cho đến nay là:
Trong DistanceQuantity (và những người khác tương tự):
public DistanceQuantity() {
}
public DistanceQuantity add(DistanceQuantity d1) {
DistanceQuantity dn = new DistanceQuantity();
Object o = super.add(dn, this, d1, DistanceUnit.REF_UNIT);
return (DistanceQuantity) o;
}
Trong DimensionQuantity (trừ một số báo cáo ít có liên quan):
public Object add(DimensionQuantity dn, DimensionQuantity d1, DimensionQuantity d2,
AbstractUnit au) {
dn.unit = au;
dn.scalar = d1.scalar + d2.scalar;
dn.units = dn.scalar;
return dn;
}
bất cứ ai có thể đưa ra với mã gọn gàng hơn - đó là vẫn loại- an toàn? TIA
nó tốt hơn (rõ ràng hơn khi bạn có rất nhiều generics) để đặt tên cho generics một cái gì đó gần gũi hơn với T_DimensionQuantity – Egwor
Bạn quên từ khóa trừu tượng. ;) Chỉ cần sử dụng 'T' là thực hành khá chuẩn mà tôi nghĩ. – Michael
@mangst cảm ơn, bây giờ nó trừu tượng. @Egwor, như @mangst cho biết, T là phổ biến. T cho Type, trong Collection là E cho Element, trong Map là K và V cho Key và Value. Thông thường đó là chữ cái đầu tiên của generics của bạn có nghĩa là. –