【问题标题】:How To ensure that a variable is used in all the child classes?如何确保在所有子类中都使用一个变量?
【发布时间】:2014-09-30 10:17:00
【问题描述】:

如果我有一个接口汽车,它要在称为 BMW、AUDI 等的各种类上实现。现在我希望它们都有一个字符串实例颜色,它们的颜色应该存储在其中。因为它们都可以有不同的颜色,所以我不能在接口中将变量定义为强制最终的,因此它的值不会根据类的需要而改变。那么有什么方法可以确保每个班级都使用颜色。

另外请告诉我为什么接口中的变量总是最终的,即如果它们不是最终变量会有什么问题。 我已经回答了以下问题,但没有一个令人满意 Why are interface variables static and final by default?

Interface Variables

Variables in Interface

还有其他几个。

【问题讨论】:

  • Interface 表示合约需要遵循谁在执行它。所以它有我们需要实现的抽象方法。和 final 变量,因为该值应该在实现接口的子类中使用。子类不应该改变超出合同的价值
  • 你已经经历了最好的解释之一,但不知道你怎么不满意。
  • 对于为每个实现类定义单独的颜色变量并通过设置器设置它们是否有任何限制。
  • @Imaran 因为到处都描述了 final 关键字的功能,但我想知道如果接口中的变量不是最终的,为什么我们不能使用通用变量?
  • 因为那将是实现而不是接口,所以你的设计让我担心。我认为你想要一个带有颜色的抽象类,而不是一个接口。

标签: java oop inheritance


【解决方案1】:

您的界面将提供如下方法:

void setColor(String color);

String getColor();

那么子类就可以实现这些方法了

您不会将变量本身存储在接口中,因为这是一个实现细节

【讨论】:

    【解决方案2】:

    为什么要使用接口?

    使用抽象类来保存颜色数据似乎更好(在接口上使用 get/set 不会强制字段的存在......)

    public abstract class AbstractAuto {
    
        private String color;
    
        public void setColor(String color) {
            this.color = color;
        }
    
        public String getColor() {
            return color;
        }
    
        public abstract void ignite();
    
        ...
    }
    
    public class Audi extends AbstractAuto {
    
        Audi()
        {
            setColor("red");
        }
    
        @Override
        public void ignite() {
            // TODO Auto-generated method stub
    
        }
    }
    

    【讨论】:

    • 是的,你是绝对正确的。但是在这里你在构造函数中而不是在抽象类中强制它。因此,这样界面将强制使用这些功能,并且在结构上您也可以这样做。所以从技术上讲,两者都是很好的例子。
    【解决方案3】:

    接口是指实现它的类需要遵循的契约。

    因此,在合同中定义某些内容。在这里,您希望用户强制具有颜色,然后在界面中定义将强制他具有颜色的方法

    void setColor(String color);
    
    String getColor();
    

    为什么接口的变量是final的?

    你会得到很多关于这个的参考。但是用简单的话理解。接口意味着强制对实现它的类做一些事情。所以我们有一个 final 变量,因为我们强制类应该只使用这个值而不是任何其他值。

    static final int WHEELS=4;
    

    【讨论】:

    • 如您的示例中所引用的,我们有一个值为 4 的变量 wheel,但我担心的是,我们知道每辆车都会有轮子,所以我们想强制类使用名为 wheel 的变量,但在同时我们也知道不同的变量可以有不同的车轮值,那么在这种情况下该怎么办。
    • @OshoParth:你只给出了答案。我们知道每辆汽车都有 4 个轮子,但子类可能是 3 个轮子的汽车。所以强迫他们你可以制造汽车但有轮子 4。这个变量只适用于汽车。
    【解决方案4】:

    不,您不能通过接口强制使用实例变量。您只能强制实施者使用“getColor()”。如果你想要一个实例变量,你可以创建一个带有实例变量的基类,并让其他人扩展你的类。

    【讨论】:

      【解决方案5】:

      我搜索了答案,我得到的满意答案是实例成员在调用构造函数时获得内存,这在接口的情况下是不可能的,因此它们需要是静态的,以便获得内存。

      并且就最终的原因而言被认为是为了避免数据歧义。让我们考虑一个场景,当两个类将实现一个接口并访问一个静态的静态数据成员时,从一个类所做的更改会影响另一个类的值,从而导致数据歧义,因此它们是最终的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-25
        • 2015-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多