Java:限制对复合类方法的访问(接口和组合)

时间:2018-12-28 19:16:02

标签: java interface composition

@Getter
public abstract class BaseProduct {
    Account account = new Account();
}

public class ProductOne extends BaseProduct {
    FieldOne fieldOne = new FieldOne();
}

public class ProductTwo extends BaseProduct {
    FieldTwo fieldTwo = new FieldTwo();
}

public class Account {
    public TypeOne methodOne() {
        return typeOne;
    }

    public TypeTwo methodTwo() {
        return typeTwo;
    }
}

public class MyClass {

    ProductOne productOne = new ProductOne();
    productOne.getAccount().methodOne();    //accessible
    productOne.getAccount().methodTwo();    //not accessible (error)

    ProductTwo productTwo = new ProductTwo();
    productTwo.getAccount().methodOne();    //not accessible (error)
    productTwo.getAccount().methodTwo();    //accessible
}

因此,我有两个类(ProductOne和ProductTwo),它们从基本抽象类(BaseProduct)继承。 基础抽象类依次创建另一个类(帐户)的对象

现在,我想限制对ProductOne对象的Account类的某些方法的访问,并类似地限制对ProductTwo对象的某些其他方法的访问。

我认为我需要将Account类创建为Interface / Abstract类,并为其创建不同的实现。这种理解正确吗?你能告诉我如何做到这一点吗?

1 个答案:

答案 0 :(得分:0)

这里似乎有两行Product概念。您可以做的是使BaseProductAccount都抽象并使用泛型。

public abstract class BaseProduct<A extends Account> {
    public abstract A getAccount();
}

class ProductOne extends BaseProduct<TypeOneAccount> {
    FieldOne fieldOne = new FieldOne();
}

class ProductTwo extends BaseProduct<TypeTwoAccount> {
    FieldTwo fieldTwo = new FieldTwo();
}

这将允许将具体的“产品”类型绑定到特定的Account类型。

然后,从methodOne中删除methodTwoAccount并在实际的“类型一”和“类型二”类中实现它们:

public abstract class Account {
}

public class TypeOneAccount extends Account {
    public TypeOne methodOne() {
        return typeOne;
    }
}

public class TypeTwoAccount extends Account {
    public TypeTwo methodTwo() {
        return typeTwo;
    }
}

使用此方法,以下两项将在编译时失败

//fails because productOne.getAccount() returns a TypeOneAccount object,
//which doesn't have methodTwo()
productOne.getAccount().methodTwo()

//fails because productTwo.getAccount() returns a TypeTwoAccount object,
//which doesn't have methodOne()
productTwo.getAccount().methodOne()