gpt4 book ai didi

java - 如何定义必须在接口(interface)内重写的常量?

转载 作者:行者123 更新时间:2023-11-30 03:23:39 25 4
gpt4 key购买 nike

为了创建玩家可以选择的套件,我制作了一个界面:

public interface Kit {}

我已经为每个套件实现了它:

public class Ninja implements Kit {}

现在,我想设置一些与类相关的常量,而不是与实例相关的常量。我希望这些在接口(interface)的所有实现中都是静态的,并且我希望每个实现都覆盖它们。

尝试#1:

public interface Kit {
String DISPLAY_NAME;
// The blank final field DISPLAY_NAME may not have been initialized
}

尝试#2:

public interface Kit {  
static String getDisplayName();
// Illegal modifier for the interface method getDisplayName; only public & abstract are permitted
}

最佳答案

接口(interface)不能像类保存字段那样保存数据。如果您不希望实例化 Kit,那么您很可能需要一个抽象类。将它们视为可以具有一些实现和字段的接口(interface)。

注意,请阅读进一步说明: Read More

所以你想要在后台有一个抽象类,而不是一个接口(interface)。现在看起来怎么样?

public abstract class Kit {
protected final String name = "Foo";

public String getName () {
return name;
}
}

这里我们有我们的 Kit,每个实现 Kit 的类都可以访问 name 字段。如果它应该是一个常量,我可能建议将其用大写字母表示。静态属性可能也是最好的。更多内容可以阅读 here

为了说明这一点,我让两个类继承了我们的抽象类 KitNinja测试

public class Ninja extends Kit {
}

这个类的目的只是检查name是否真的具有Foo的值。

然后我们还需要实际的测试类。

public class Test extends Kit {
public static void main (String[] args) {
Test ninja = new Test ();
System.out.println(ninja.getName()); // foo
Ninja ninja2 = new Ninja ();
System.out.println(ninja2.getName()); // foo
}
}

它们都是不同的类型,分别是测试Ninja 但它们的 name 字段中都有 foo 值。对于从 Kit 继承的每个类都是如此。

如果要求必须重写,那么我建议添加 Kit构造函数,以强制用户从基础添加数据类。

public abstract class Kit {
protected String name;

public Kit (String name) {
this.name = name;
}

public String getName () {
return name;
}
}

现在,每个从 Kit 继承的类都必须调用 super (String),这意味着将为每个对象设置 name 字段。它可以不同于class A extends Kitclass B extends Kit。这是您搜索的内容吗?

如果是这样,那么实现class Aclass B将沿着这些思路进行。

class A extends Kit {
public A (String name) {
super (name);
}
}

对于B,它将如下。

class B extends Kit {
public B (String name) {
super (name);
}
}

现在它们是不同的类,可以保存不同的字段和方法,但它们都需要设置基类:Kitname字段。

关于java - 如何定义必须在接口(interface)内重写的常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30762766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com