2012-08-13 29 views
23

Giả sử tôi có một lớp A:Override hàm mà không cần mở rộng các lớp

public class A { 
    public A(){....} 
    public void method1() {...} 
}; 

Và một thể hiện của lớp đó:

A anA = new A(); 

Có cách nào để ghi đè lên method1() chỉ cho anA? Câu hỏi này nảy sinh khi tôi viết một chương trình vẽ nhỏ, trong đó tôi phải mở rộng lớp JPanel vài lần chỉ để thực hiện các thay đổi nhỏ đối với các bảng khác nhau có các đặc điểm hơi khác nhau.

Trả lời

46

Bạn có thể làm như sau:

A anA = new A() { 
    public void method1() { 
     ... 
    } 
}; 

Đây là giống như:

private static class myA extends A { 
    public void method1() { 
     ... 
    } 
} 

A anA = new myA(); 

Chỉ với ngoại lệ mà trong trường hợp này myA có thể được tái sử dụng. Điều đó là không thể với các lớp ẩn danh.

+14

Đúng, tuy nhiên về mặt kỹ thuật điều này đang tạo lớp ẩn danh mở rộng lớp A. –

+0

@StephenC Thật vậy. Tôi đã cập nhật câu trả lời. Cảm ơn bạn đã chỉ ra. – jensgram

+0

@jensgram Điều này có thể là muộn nhưng cảm ơn bạn rất nhiều. –

13

Bạn có thể tạo một lớp ẩn danh mới một cách nhanh chóng, miễn là bạn đang sử dụng các nhà xây dựng không-arg của lớp học của bạn A:

A anA = new A() { 

    @Override 
    public void method1() { 
    ... 
    } 
}; 

Lưu ý rằng những gì bạn muốn làm là rất gần với cái được gọi là lambda, sẽ xuất hiện trong bản phát hành tiếp theo 8 của Java SE.

2

Tôi thích làm việc này với đại biểu hoặc "mẫu chiến lược".

public interface ADelegate { 
    public void method1(); 
} 

public class A { 
    public A(){....} 
    public ADelegate delegate; 
    public final void method1() { delegate.method1(); } 
}; 

A anA = new A(); 
anA.delegate = new ADelegate() { 
    public void method1() { ... } 
}; 
Các vấn đề liên quan