0

我有一个名为的类Property,它只有get-methods。创建新实例时将设置所有字段PropertyProperty实现了一个名为IProperty.

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

问题是我不能让这个方法在 中受保护Property,因为 Eclipse 告诉我将它添加到接口IProperty并使其公开。

有一些解决方法吗?

WrapperI 属性:

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;
    }
}

财产:

public interface IProperty {

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

}

这就是它目前的样子。显然它不起作用,因为我不能让该方法在Property类中受到保护。因此,我最好以某种方式摆脱 interfacee 条目。但是怎么做?

4

4 回答 4

1

您可能想要做的是不理会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();

}
于 2012-06-22T13:42:40.127 回答
0

an 中的方法Interface在范围内是公共的,因此实现类不能通过降低其可访问性来覆盖方法。使他们public

于 2012-06-22T12:38:35.543 回答
0

接口中不能有公共方法,而实现此接口的类中不能有私有或受保护的方法名。

因此,您可以在 Class 中公开methodName :

  • 这个方法什么都不做
  • 此方法调用[another]methodNameProtected(您为新的受保护方法提供另一个名称)

更新

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

于 2012-06-22T12:56:24.683 回答
0

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

WrapperI 属性:

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;
    }
}

财产:

public interface IProperty {

    [...]
}

这将完成这项工作

于 2012-06-22T13:59:45.930 回答