【问题标题】:Requirements for constructor in interface接口中构造函数的要求
【发布时间】:2014-02-06 17:59:01
【问题描述】:

首先,要明确一点,我知道什么是接口。

我的意思是,我可以要求实现接口的类在接口中提到构造函数吗?

如下:

public interface IA {
    /*constructor requirement*/
    public IA(int, int, int, int, int, int, int);
}

public class A implements IA {
    /* Because I implements IA, I have to make this contructor */
    public A(int, int, int, int, int, int, int) {
        ....
    }
}

【问题讨论】:

  • 实际情况是我正在使用通用枚举创建一个类。我希望枚举带有一个对象。因此,这需要具有特定参数的构造函数。枚举不允许直接“扩展”
  • 明确地说,我只想知道是否有任何方法通过接口强制类获取具有特定参数的构造函数

标签: java android interface constructor enums


【解决方案1】:

不允许在接口中指定构造函数。这不应该被允许,因为构造函数不是继承的。如果超类具有构造函数Superclass(int, int, int),则不会强制子类具有构造函数Subclass(int, int, int)。因此,接口也不应该能够强制构造函数。

JLS, Section 9.1.4,声明了接口主体中唯一可以存在的东西:]

接口的主体可以声明接口的成员,即字段(§9.3)、方法(§9.4)、类(§9.5)和接口(§9.5)。

InterfaceBody:
    { InterfaceMemberDeclarationsopt }

InterfaceMemberDeclarations:
    InterfaceMemberDeclaration
    InterfaceMemberDeclarations InterfaceMemberDeclaration

InterfaceMemberDeclaration:
    ConstantDeclaration
    AbstractMethodDeclaration
    ClassDeclaration 
    InterfaceDeclaration
    ;

这意味着 Java 明确禁止接口中的构造函数; JLS 没有在可以成为接口成员的事物列表中列出构造函数。

【讨论】:

  • 我不认为这是一个正当的理由。如果我编写一个需要“getClass()”方法的接口。每个对象都有一个 getClass 方法,没有人需要编写一个新方法来匹配接口。界面应该只是确保您拥有它。
  • 因此,如果 Superclass(int, int, int) 存在,则没有任何改变。但是如果某个没有它的类说要实现那个接口,它应该写一个 Someclass(int, int, int)
  • 你可以强制一个类有一个带有接口的getClass() 方法,但那是一个方法,而不是构造函数,构造函数不是继承的。您可以得到的最接近的方法是强制子类构造函数调用超类构造函数,方法是使Superclass 中的唯一构造函数获取所有必需的参数。
  • 如果你的 Superclass(int, int, int) 没有默认构造函数并且只有 Superclass(int, int, int) 构造函数,那么你的子类 SomeClass 将不得不调用该构造函数。这将保证 Superclass 仍然得到它需要的参数。但是,SomeClass 不必实现 Someclass(int, int, int) 构造函数。它可以以任何适合 SomeClass 的方式将值传递给 Superclass(int, int, int),例如使用默认值。
  • mdewitt 我的意思是 SomeClass 与 SuperClass 没有任何继承关系,但您似乎明白了我的想法。那就是我的意思。 SomeClass 是另一个在整个超类中没有 SomeClass(int,int,int) 的类。
【解决方案2】:

没有。你也许可以用 builder 做类似的事情。

【讨论】:

    【解决方案3】:

    在其最常见的形式中,接口是一组具有空主体的相关方法。如果将自行车的行为指定为接口,则可能如下所示:

    interface Bicycle {
    
        //  wheel revolutions per minute
        void changeCadence(int newValue);
    
        void changeGear(int newValue);
    
        void speedUp(int increment);
    
        void applyBrakes(int decrement);
    }
    

    要实现这个接口,你的类的名字会改变(比如特定品牌的自行车,例如 ACMEBicycle),你可以在类声明中使用 implements 关键字:

    class ACMEBicycle implements Bicycle {
    
        // remainder of this class 
        // implemented all methods of interface
    }
    

    接口根本没有构造函数,如果接口中有方法,则必须实现类中的所有方法,否则将实现接口的类标记为抽象类

    这是接口中的抽象方法,不是构造函数

    public IA(int, int, int, int, int, int, int);
    

    【讨论】:

      猜你喜欢
      • 2012-10-14
      • 2011-02-17
      • 2010-12-13
      • 1970-01-01
      • 2015-04-13
      • 2011-12-20
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多