2012-04-27 24 views
5

Tôi muốn có một hàm tạo như sau.Java: thêm hai giá trị cùng loại mà cả hai đều là lớp con của java.lang.Number

public Attribute(String attrName, Number attrValue){ 
    this.name = attrName; 
    this.value = attrValue; 
} 

Trong trường hợp này, tôi muốn có phương thức được gọi là incrementValue (Số n) sẽ thêm n vào giá trị. Tôi biết bạn không thể thêm hai đối tượng Số cùng nhau do các vấn đề có thể xảy ra khi truyền. Tuy nhiên, nếu tôi sử dụng một kiểm tra để đảm bảo giá trị và n là cùng một loại là nó có thể thêm chúng lại với nhau? Hoặc có lẽ có một cách tốt hơn để đi về điều này.

Ngay bây giờ tôi đang khai báo các biến mẫu của Integer và Double và gán giá trị cho đúng loại. Tôi đã tự hỏi về việc mở rộng điều này để cho phép bất kỳ phân lớp con nào của Number. Rõ ràng là tôi có thể viết các phương pháp riêng biệt cho từng phương pháp nhưng điều đó có vẻ như lập trình kém.

Điều này có thể thực hiện được trong java không? Tôi đang đi về điều này hoàn toàn sai?

+0

Điều gì biện minh cho việc sử dụng siêu lớp trừu tượng 'Số'. Bạn đang sử dụng các lớp con cụ thể hơn nữa trong chế độ thừa kế của bạn? – Perception

+0

@Perception Tôi muốn cho phép nhiều loại nhất có thể như tôi có thể cho phép vì đây là thực hành/vui vẻ và có thể muốn mở rộng sau này. – thealfreds

Trả lời

5

Bạn có thể convert all Numbers to a single type (double là nhất-lossy):

class Attribute { 

    private double value; 

    public Attribute(String attrName, Number attrValue) { 
     this.name = attrName; 
     this.value = attrValue.doubleValue(); 
    } 

} 

Nhưng IMO bạn nên chỉ quá tải nhà xây dựng; Number thực sự không phải là một lớp học hữu ích khủng khiếp trong kinh nghiệm của tôi (và I don't seem to be the only one who thinks so).

class Attribute { 

    public Attribute(String attrName, int attrValue) { 
     this.name = attrName; 
     this.value = attrValue; 
    } 

    public Attribute(String attrName, double attrValue) { 
     this.name = attrName; 
     this.value = attrValue; 
    } 
} 
+0

Đó là chính xác những gì tôi có bây giờ. Tôi đã hy vọng sẽ cho phép BigInteger, BigDecimal, Byte, vv Sau khi tạo phương thức incrementValue() cho mỗi mã là rất nhiều bản sao chép. – thealfreds

+0

Trên thực tế suy nghĩ về nó, là có một lý do chính đáng để bao gồm các loại khác? Tôi đã nghĩ rằng điều này có thể có thể được lưu trữ trong một cơ sở dữ liệu và nghĩ rằng tôi có thể cần cho phép cho tất cả các loại. – thealfreds

+2

Để thêm 'BigInteger' và' BigDouble', bạn phải sử dụng [instance methods] (http://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html#add (java. math.BigInteger)). ** Bạn không thể sử dụng '+'. ** Tôi sẽ suy nghĩ lại về thiết kế của bạn và bạn có thực sự cần hỗ trợ mọi kiểu số có thể duy nhất hay không. –

0

Không, không thể thực hiện được trong Java. Điều tốt nhất bạn có thể làm là xem xét tất cả các trường hợp của Number mà bạn biết.

Tôi chắc chắn có thể viết một lớp con Number mà nó không thể, mặc dù nó sẽ là một thực hiện hơi vô nghĩa.

Các vấn đề liên quan