Java 强制在接口中指定的方法只能在抽象类之外定义
这是一个我已经挠头好一阵子了 假设您希望在接口中指定一个方法,但在实现级别之前不希望实际定义它。也就是说,您希望在接口中指定一个方法,如果它是在抽象类中定义的,编译器将抛出一个错误Java 强制在接口中指定的方法只能在抽象类之外定义,java,abstract-class,Java,Abstract Class,这是一个我已经挠头好一阵子了 假设您希望在接口中指定一个方法,但在实现级别之前不希望实际定义它。也就是说,您希望在接口中指定一个方法,如果它是在抽象类中定义的,编译器将抛出一个错误 public interface Thing{ public void method1(); public void method2(); //method3 should be implementation specific public void method3();
public interface Thing{
public void method1();
public void method2();
//method3 should be implementation specific
public void method3();
}
然后我有一个抽象类:
public abstract class BasicThing{
@Override
public void method1(){}
@Override
public void method2(){}
}
以及我的实现特定代码:
public class ThingImpl{
@Override
public void method3(){}
}
(顺便说一句,我知道这样写是有效的,但我想这样做的原因是,如果我正在编写接口并将其传递给其他人,然后由其他人传递以执行最终实现,我希望能够强制他们执行额外的规范)您应该在抽象基本类中使用抽象方法
public abstract void method3();
您应该在抽象基本类中使用抽象方法
public abstract void method3();
不,在编译时没有办法这样做。这也是一个很奇怪的要求,国际海事组织 当然,正如Sheik的回答所示,您可以通过抽象类的合作来完成。但是,不能通过在接口中添加特定的内容来强制抽象类这样做
您可以尝试在单元测试中找到所有相关的类并验证您的需求。不,在编译时无法做到这一点。这也是一个很奇怪的要求,国际海事组织
I think what u need is an anonymous inner-class implementations for your interface.
public class MyClass{
public void do something()
{
Thing th1=new Thing(){
@Override
public void method3(){
System.out.println("****My Method3***");
}
};
th1.method3();
}
};
当然,正如Sheik的回答所示,您可以通过抽象类的合作来完成。但是,不能通过在接口中添加特定的内容来强制抽象类这样做
您可以尝试在单元测试中找到所有相关类并验证您的需求。也许我误解了这个问题,但我相信OP希望在接口上而不是在抽象类中实施这一点。我已经重新阅读了这个问题,我认为您是对的(按照通常的:p)似乎想做一件很奇怪的事。OP你能提供你为什么要这样做的任何细节吗,我很好奇。谢谢Sheik,我仔细考虑了一下,但Jon说得对——我只想编写接口,然后把它传递给其他人,让他们在抽象类中编写一些通用代码。问题是,我想让他们实现他们认为合适的方法,但为了不让他们太兴奋而逃避,我想强制他们这样做,某些方法不能在抽象类中定义,必须由(不同的)类定义编写特定于实现的类的人。@user1551209听起来您更喜欢有一个过程问题而不是软件问题。也许我误解了这个问题,但我相信OP希望在接口上而不是在抽象类中实施这个问题。我已经重读了这个问题,我认为您是对的(按照通常的:P)似乎想做一件很奇怪的事。OP你能提供你为什么要这样做的任何细节吗,我很好奇。谢谢Sheik,我仔细考虑了一下,但Jon说得对——我只想编写接口,然后把它传递给其他人,让他们在抽象类中编写一些通用代码。问题是,我想让他们实现他们认为合适的方法,但为了不让他们太兴奋而逃避,我想强制他们这样做,某些方法不能在抽象类中定义,必须由(不同的)类定义编写特定于实现的类的人员。@user1551209听起来您更喜欢有一个过程问题,而不是软件问题。也许这有点奇怪,但没有人指责开发人员过于明确:D太糟糕了,我希望有一个更优雅的解决方案。也许这有点奇怪,但从来没有人指责开发人员过于明确:D太糟糕了,我希望有一个更优雅的解决方案。
I think what u need is an anonymous inner-class implementations for your interface.
public class MyClass{
public void do something()
{
Thing th1=new Thing(){
@Override
public void method3(){
System.out.println("****My Method3***");
}
};
th1.method3();
}
};