如何指定实现类必须包含特定字段?

时间:2009-12-28 20:20:46

标签: java inheritance abstract-class

我想编写一个

的抽象类(或接口)
  • 强制所有实现类提供特定类型和名称的字段(理想情况下是静态的)(如果丢失,可能会抛出编译时错误?)或
  • 自动提供实现类的字段。

一个例子是:

public abstract class A {
    abstract int counter;
}

public class B extends A {
    public int getCounter() {
        return counter;
    }
}

在这种情况下,B的getCounter()方法会返回特定于 counter 类的(静态或实例)B ,而不是值继承自 A。有没有办法在Java中做到这一点?

6 个答案:

答案 0 :(得分:8)

没有一个好方法可以做到这一点,我也不相信应该这样做。您可以使用抽象方法完成相同的操作,并在基类中编写算法,以便它们利用委派的方法。

如果您提供有关您认为需要执行此操作的详细信息,我们可以帮助您制定更正确的解决方案。

例如:

public abstract class A {

    protected abstract int getCounter();

    public void doStuff() {
        int counter = getCounter();
        for (int i=0; i < counter; i++) {
            // do stuff
        }
    }

}

答案 1 :(得分:1)

使用类作为键创建HashMap,将计数器作为值。

答案 2 :(得分:1)

接口的主要目的不是告诉其实现者该做什么。它告诉其他类它的实现者可以做什么。此外,它不应指定任何实现细节。也就是说,它不应该也不能强加任何变量声明。

如果你想要一个per-subclass计数器,那么在超类中声明一个Map,使用key = subclass的Class,并且value =计数器值(由 ThorbjørnRavnAndersen的答案)

答案 3 :(得分:0)

尝试使用此处列出的众多工具之一:

http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis#Java

我假设这是在一个有多个开发人员的开发环境中。

答案 4 :(得分:0)

正如其他人所指出的那样,如果没有相当多的额外工作,这在语言中是不可能的。

我的建议是你遵循Pace的建议:不要指定计数器,而是将其指定为界面中的方法。

我建议的唯一区别是你将它重命名为更能正确反映你意图的东西。类似的东西:


    protected abstract getNumberOfInstancesOfThisClass();

你甚至可以编写一个自动单元测试生成器来检查它是否已经正确实现,即使你可以在抽象类中创建一个静态成员,你也必须这样做。

答案 5 :(得分:0)

public abstract class A {
   private static Map<Class,Integer> map = new HashMap<Class,Integer>();
   protected A() { map.put(this.getClass(), 0); }

   public int getCounter() { return map.get(this.getClass()); }
   public void setCounter(int n) { map.put(this.getClass(), n); }
}

public class B extends A {
   ...    
}