gpt4 book ai didi

java - 为什么接口(interface)不能有字段?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:08:13 27 4
gpt4 key购买 nike

忽略第二次编辑之前的所有内容

我正在尝试做这样的事情:

public interface IModifier{
public String nameTag;
public void foo();
}

我尝试这样做的原因是:我有一个类 SpecificModifier implements IModifier并且有许多非常相似的类也实现了 IModifier。我希望每个实现 IModifier 的类都有一个公共(public) String nameTag。

编辑:我已经确认我不能这样做,但是有人可以解释为什么接口(interface)不能要求字段吗?

编辑二:

我对抽象类与接口(interface)用途的理解。接口(interface)纯粹用于声明实现它的任何必要部分,以便所有对象都有可以引用的公共(public)部分。而抽象类用于为多个类提供通用功能。

这有点过于简化了,但无论如何,除了语言设计者的疏忽,我仍然看不出有什么理由可以让接口(interface)不能有抽象字段。

任何人都可以提供原因吗?

最佳答案

接口(interface)指定了一个契约,实现该接口(interface)的具体类必须遵守该契约。这个契约描述了一个实现应该如何行动。在接口(interface)规范中,应该有明确的注释来描述每个方法的目的是什么。接口(interface)的使用将契约与实际实现分离。字段是一个实现细节,因为字段不描述类应该如何“充当”。

例如,接口(interface)通常用作声明类型,具体实现用作实际类型。

    Map<Key,Value> m = new HashMap<>();

暂时考虑 java.util.Map 接口(interface)。它通过它的一组方法描述了 Map 应该如何行动。 Map 接口(interface)有几种不同的实现方式,允许用户根据自己的需要选择正确的实现方式。

指定一个字段必须由多个子类使用意味着类层次结构具有某种相似性。在这种情况下,抽象类可以解决问题。

   abstract class IModParent implements IModifier{
protected String nameTag;
}

现在您可以拥有一个具体的类。

   class SpecificModifier extends IModParent{

SpecificModifier(String nameTag){ this.nameTag = nameTag; }

@Override
public void foo(){ System.out.println(nameTag); }
}

和声明。

    IModifier imod = new SpecificModifier("MyName");

这使您可以灵活地使用接口(interface)类型,同时仍然能够通过不可实例化的抽象类在您想要的具体类组之间共享实现细节。

关于java - 为什么接口(interface)不能有字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32216081/

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