Tôi nghĩ bạn thân thiết, nhưng bạn thiếu một số khái niệm chính. Điều này là do bạn sẽ không hoạt động trong mọi tình huống. Hãy thử ví dụ này bằng cách sử dụng mã hiện tại của bạn ...
Fraction a = // this is however you're making a fraction object...
Fraction b = // do EXACT same thing here that you did for a
// And then, this will illustrate what is wrong with your program...
if(a.equals(b)) {
System.out.println("This won't print");
} else {
System.out.println("This will print because your method just checks for reference");
}
Vì vậy, đây là những điều cơ bản bạn cần phải hiểu:
- Sự khác nhau giữa
==
và equals
- So sánh kiểu như trái ngược với tham chiếu hoặc giá trị
- Tránh đúc bằng cách đặt của bạn "bằng" ở đúng nơi
Trước hết ...
public boolean equals(Object other){
if (other == this){
return true;
} else {
return false;
}
}
Bạn đang thiếu điểm của phương thức "bằng" trong Java. ==
được sử dụng để so sánh tài liệu tham khảo trong khi this.equals(foo)
được sử dụng để đặt logic để so sánh các đối tượng ở một địa điểm được bản địa hóa.
Khái niệm khác bạn đang thiếu là cách sử dụng instanceof. Khi bạn hỏi điều này ...
Nếu tôi thử khác == Phân số, nó không biên dịch.
Điều này là do bạn đang tìm cách so sánh loại đối tượng. Để thực hiện việc này, bạn chỉ cần thực hiện ...
if(other instanceOf Fraction) {
// do stuff...
}
Tất cả điều đó được nói, có một khái niệm cuối cùng, đặt định nghĩa bằng ở vị trí thích hợp. Bạn cần phải đặt nó bên trong lớp Fraction của bạn và xác định nó như thế này ...
public boolean equals(Fraction other) {
// do something like this (you will have to define toDouble)
if(this == other || this.toDouble() == other.toDouble()) {
return true;
}
return false;
}
này sẽ ghi đè mặc định ...
public boolean equals(Object other) {/* ... */}
Và nó sẽ làm cho nó cực kỳ thuận tiện. Dưới đây là một số mẫu mã như thế nào ...
Fraction fractionA = new Fraction("2/4");
Fraction fractionB = new Fraction("1/2");
Fraction fractionC = new Fraction("1/3");
Object trollObject = new Object();
// And then call random equals objects...
if(fractionA.equals(fractionB)) {
// should be true...
}
if(fractionB.equals(fractionA)) {
// should be true...
}
// This avoids having to do any casting because
// since you've only defined a Fraction.equals(Fraction) method
// it should instead default to the Object.equals method
if(trollObject.equals(fractionB)) {
}
Bạn có biết lớp học nào là 'khác' không? Ngoài ra, +1 để đánh dấu bài tập về nhà này và câu hỏi được đặt ra tốt! – macduff
Lưu ý rằng hầu hết các câu trả lời cho đến nay sẽ thất bại nếu 'khác' thực hiện' FractionInterface' nhưng không phải là lớp 'Phân số'. Bạn nên rõ ràng trong tâm trí của bạn cho dù bạn muốn một giải pháp mà chỉ hoạt động khi 'khác' là một thể hiện của' phân số', hoặc một trong đó hoạt động khi 'khác' là một thể hiện của' phân số' hoặc một trong các lớp con của nó, hoặc một hoạt động với bất kỳ đối tượng nào thực hiện 'FractionInterface'. Bạn cần mã khác nhau cho từng trường hợp. –