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();
}
};