繁体   English   中英

如何在Java中实现接口的类中添加受保护的方法?

[英]How can I add a protected method to a class implementing an interface in java?

我有一个叫做Property的类,除了get方法外别无其他。 创建Property的新实例时将设置所有字段。 Property实现了一个称为IProperty的接口。

由于我使用的库中存在一些错误,因此在创建Property实例后,必须重新设置其名称。 因此,建议创建一个WrapperProperty类,该类将提供一个公共setName方法,该方法本身将在Property调用因此创建的setName()方法,该方法将受到保护/封装。

问题是我无法在Property中使此方法受保护,因为Eclipse告诉我将其添加到接口IProperty并将其公开。

有一些解决方法吗?

包装IP属性:

public class WrapperIProperty {

    private IProperty prop;

    WrapperIProperty(Property prop) {
        this.prop = prop;
    }

    public void setName(String name) {
        prop.setName(name);
    }
}

属性:

public class Property implements IProperty {

    String name;

    protected void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
    public int getFoobar() {
        return 123;
    }
    public int getWhatever() {
        return 987;
    }
}

IPProperty:

public interface IProperty {

    public int getWhatever();
    public int getFoobar();
    public String getName();

}

目前情况就是这样。 显然,这是行不通的,因为我无法让该方法在Property类中受到保护。 因此,我最好以某种方式摆脱接口条目。 但是如何?

您可能想要做的就是不让IProperty接口(不要向其中添加setName方法),而是创建一个提供所需方法的委托包装器类(包装接口的实现)。

这样,您可以将包装的属性和常规属性提供给需要的任何内容。

public class WrappedProperty implements IProperty {

    private String name;

    private Property prop;

    WrappedProperty (Property prop) {
        this.prop = prop;
    }

    protected void setName(String name) {
        this.name = name;
    }
    public int getWhatever() {
        return prop.getWhatever();
    }
    public int getFoobar() {
        return prop.getFoobar();
    }    
    public String getName() {
        if (this.name == null) {
           return prop.getName():
        } else {
            return this.name; 
        }
    }
}
public class Property implements IProperty {        

    public String getName() {
        return "blah";
    }
    public int getFoobar() {
        return 123;
    }
    public int getWhatever() {
        return 987;
    }
}
public interface IProperty {

    public int getWhatever();
    public int getFoobar();
    public String getName();

}

Interface中的方法在范围上是公共的,因此实现类不能通过减少其可访问性来覆盖方法。 public

您不能在接口中具有公共methodName ,而在实现此接口的Class中不能具有私有或受保护的methodName

因此,您可以在您的Class中使用methodName公共:

  • 这种方法什么都不做
  • 此方法调用[another] methodNameProtected (为新的受保护方法命名)

更新

如果只希望在Interface中使用它,则必须在AbstractClass中更改Interface,然后将方法public final returnCode methodName放入其中,如果该方法对于所有继承的类都是通用的

找到了解决该问题的方法:

包装IP属性:

public class WrapperIProperty {

    private Property prop;

    public WrapperIProperty(IProperty prop) {
        this.prop = (Property) prop;
    }

    public void setName(String name) {
        prop.setName(name);
    }

}

属性:

public class Property implements IProperty {

    private String name = null;

    [...]

    void setName(String name) {
        this.name = name;
    }
}

IPProperty:

public interface IProperty {

    [...]
}

这样就可以了

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM