Bạn không thể ép buộc một lớp con để ghi đè lên một phương pháp. Bạn chỉ có thể ép buộc nó thực hiện một phương thức bằng cách làm cho nó trừu tượng.
Vì vậy, nếu bạn không thể làm myMotherClass trừu tượng bạn chỉ có thể giới thiệu một lớp cha mà kéo dài myMotherClass và các đại biểu cho phương thức đó phải được thực hiện:
public abstract class EnforceImplementation extends myMotherClass {
public final void myMethod(){
implementMyMethod();
}
public abstract void implementMyMethod();
}
EDIT
tôi tìm thấy một cách khác interessting giải quyết vấn đề trong ví dụ hemcrest
api được sử dụng bởi mockito.
public interface Matcher<T> extends SelfDescribing {
/**
* Evaluates the matcher for argument <var>item</var>.
* <p/>
* This method matches against Object, instead of the generic type T. This is
* because the caller of the Matcher does not know at runtime what the type is
* (because of type erasure with Java generics). It is down to the implementations
* to check the correct type.
*
* @param item the object against which the matcher is evaluated.
* @return <code>true</code> if <var>item</var> matches, otherwise <code>false</code>.
*
* @see BaseMatcher
*/
boolean matches(Object item);
/**
* This method simply acts a friendly reminder not to implement Matcher directly and
* instead extend BaseMatcher. It's easy to ignore JavaDoc, but a bit harder to ignore
* compile errors .
*
* @see Matcher for reasons why.
* @see BaseMatcher
*/
void _dont_implement_Matcher___instead_extend_BaseMatcher_();
}
Giao diện qui định phương pháp _dont_implement_Matcher___instead_extend_BaseMatcher_
. Tất nhiên nó không ngăn cản người khác thực hiện giao diện Matcher
, nhưng nó hướng dẫn nhà phát triển đi đúng hướng.
Và lớp BaseMatcher
thực hiện các phương pháp _dont_implement_Matcher___instead_extend_BaseMatcher_
như thức
public final void _dont_implement_Matcher___instead_extend_BaseMatcher_() {
// See Matcher interface for an explanation of this method.
}
Cuối cùng tôi nghĩ rằng đây là một vấn đề thiết kế, bởi vì BaseMatcher
obviouosly thực hiện logic mà mỗi Matcher
nên thực hiện. Do đó, tốt hơn hết là làm cho lớp Matcher
trừu tượng và sử dụng một phương thức mẫu.
Nhưng tôi đoán họ đã làm điều đó vì đó là sự thỏa hiệp tốt nhất giữa khả năng tương thích bytecode và các tính năng mới.
Nguồn
2013-08-20 09:28:00
Tóm lại: Bạn không thể không làm cho nó trừu tượng –
@stonedsquirrel Còn giao diện thì sao? –
Điều này là không thể sử dụng chú thích hoặc bằng cách ném một ngoại lệ nếu lớp không thực hiện phương pháp? – Maniz