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

Java 如何指定实现类必须包含特定字段?,java,inheritance,abstract-class,Java,Inheritance,Abstract Class,我想写一个抽象类(或接口),它 强制所有实现类提供特定类型和名称的字段(理想情况下是静态的)(如果缺少,可能会抛出编译时错误?),或者 在实现类中自动提供此类字段 例如: public abstract class A { abstract int counter; } public class B extends A { public int getCounter() { return counter; } } 在这种情况下,B的getCount

我想写一个抽象类(或接口),它

  • 强制所有实现类提供特定类型和名称的字段(理想情况下是静态的)(如果缺少,可能会抛出编译时错误?),或者
  • 在实现类中自动提供此类字段
例如:

public abstract class A {
    abstract int counter;
}

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

在这种情况下,B的
getCounter()
方法将返回特定于
B
类的(静态或实例)
计数器,而不是从
a
继承的值。在Java中有什么方法可以做到这一点吗?

没有真正好的方法可以做到这一点,我也不认为应该有这样的方法。您可以使用抽象方法完成同样的事情,并在基类中编写算法,以便它们利用委托方法

也许,如果您提供更多关于为什么需要这样做的详细信息,我们可以帮助您制定一个更正确的解决方案

例如:

public abstract class A {

    protected abstract int getCounter();

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

}
公共抽象类A{
受保护的抽象int getCounter();
公共空间{
int counter=getCounter();
对于(int i=0;i
要做到这一点,没有什么好办法,我也不认为应该有。您可以使用抽象方法完成同样的事情,并在基类中编写算法,以便它们利用委托方法

也许,如果您提供更多关于为什么需要这样做的详细信息,我们可以帮助您制定一个更正确的解决方案

例如:

public abstract class A {

    protected abstract int getCounter();

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

}
公共抽象类A{
受保护的抽象int getCounter();
公共空间{
int counter=getCounter();
对于(int i=0;i
用类作为键,计数器作为值创建一个HashMap。

用类作为键,计数器作为值创建一个HashMap。

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

如果需要每个子类的计数器,则在超类中声明一个
Map
,key=subclass的
Class
,value=counter值(如
Thorbjørn Ravn Andersen的回答)

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

如果需要每个子类的计数器,则在超类中声明一个
Map
,key=subclass的
Class
,value=counter值(如
Thorbjørn Ravn Andersen的答案)

尝试下面列出的众多工具之一:


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

尝试下面列出的众多工具之一:


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

正如其他人所指出的,如果没有大量的额外工作,这在语言中是不可能直接实现的

我的建议是,遵循佩斯的建议:不要指定计数器,而是将其指定为接口中的方法

我建议的唯一区别是,你可以将它重命名为更能正确反映你意图的名称。比如:


    protected abstract getNumberOfInstancesOfThisClass();

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

正如其他人所指出的,如果没有大量的额外工作,这在语言中是不可能直接实现的

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 {
   ...    
}
我的建议是,遵循佩斯的建议:不要指定计数器,而是将其指定为接口中的方法

我建议的唯一区别是,你可以将它重命名为更能正确反映你意图的名称。比如:


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

public abstract class a{
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 {
   ...    
}
private static Map=new HashMap(); 受保护的A(){map.put(this.getClass(),0);} public int getCounter(){return map.get(this.getClass());} public void setCounter(int n){map.put(this.getClass(),n);} } 公共类B扩展了A{ ... }
公共抽象A类{
private static Map=new HashMap();
受保护的A(){map.put(this.getClass(),0);}
public int getCounter(){return map.get(this.getClass());}
public void setCounter(int n){map.put(this.getClass(),n);}
}
公共类B扩展了A{
...    
}

为什么它需要是静态的?如果一个接口有。。。公共int getCounter();实现类是否静态地执行此操作是否重要(可能它们跟踪数据库中的计数器)。我不明白为什么你需要限制它。为什么它需要是静态的?如果一个接口有。。。公共int getCounter();实现类是否静态地执行此操作是否重要(可能它们跟踪数据库中的计数器)。我不明白你为什么要限制它。实现一个计数器的每个类都需要一个名为
counter
的(静态的,理想的)变量的副本,以及该计数器的一个getter。为了最大限度地减少重复代码,我希望有办法在A中编写一个getter方法,该方法实际上返回B的计数器。这是因为将有一个“模板”抽象类(或接口)A,但有许多类似于B的实现类。似乎不需要variabl