接口中的属性/成员变量?

2022-08-31 11:32:19

我想知道是否有任何方法可以使实现器类强制声明对象句柄/基元,就像它们对方法所做的那样。例如:

public interface Rectangle {    
    int height = 0;
    int width = 0;

    public int getHeight();
    public int getWidth();
    public void setHeight(int height);
    public void setWidth(int width);                
}


public class Tile implements Rectangle{
    @Override
    public int getHeight() {
        return 0;
    }

    @Override
    public int getWidth() {
        return 0;
    }

    @Override
    public void setHeight(int height) {
    }

    @Override
    public void setWidth(int width) {   
    }

}

在上面的方法中,我们如何强制Tile类使用接口声明高度和宽度属性?出于某种原因,我希望仅使用界面来执行此操作!

我最初考虑将其与继承一起使用。但问题是我必须处理3个班级!

  1. 矩形
  2. JLabel.!

 

 class Tile extends JLabel implements Rectangle {}

会工作.!

class Tile extends JLabel extends Rectangle {}

哇,不是。!


答案 1

接口的要点是指定公共 API。接口没有状态。您创建的任何变量实际上都是常量(因此在接口中制作可变对象时要小心)。

基本上,一个接口说这里是实现它的类必须支持的所有方法。如果Java的创建者不允许在接口中使用常量,那可能会更好,但现在要摆脱它为时已晚(在某些情况下,常量在接口中是明智的)。

因为您只是指定必须实现哪些方法,所以没有状态的概念(没有实例变量)。如果你想要求每个类都有一个特定的变量,你需要使用一个抽象类。

最后,一般来说,你应该不使用公共变量,所以把变量放到一个接口中的想法是一个坏主意。

简短的回答 - 你不能做你想做的事,因为它在Java中是“错误的”。

编辑:

class Tile 
    implements Rectangle 
{
    private int height;
    private int width;

     @Override
    public int getHeight() {
        return height;
    }

    @Override
    public int getWidth() {
        return width;
    }

    @Override
    public void setHeight(int h) {
        height = h;
    }

    @Override
    public void setWidth(int w) { 
        width = w;  
    }
}

另一个版本是:

abstract class AbstractRectangle 
    implements Rectangle 
{
    private int height;
    private int width;

     @Override
    public int getHeight() {
        return height;
    }

    @Override
    public int getWidth() {
        return width;
    }

    @Override
    public void setHeight(int h) {
        height = h;
    }

    @Override
    public void setWidth(int w) { 
        width = w;  
    }
}

class Tile 
    extends AbstractRectangle 
{
}

答案 2

接口不能要求定义实例变量 -- 只能定义方法。

(变量可以在接口中定义,但它们的行为与预期不同:它们被视为 .)final static

快乐编码。