Java: ограничить доступ к методам составного класса (Интерфейс и Композиция) - PullRequest
0 голосов
/ 28 декабря 2018
@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).Класс Base Abstract по очереди создает объект другого класса (Account)

Теперь я хочу ограничить доступ к некоторым методам класса Account для объектов ProductOne и аналогичным образом ограничить доступ для некоторых других методов для объектов ProductTwo.

Я думаю, что мне нужно создать класс Account в качестве класса Interface / Abstract и создать для него различные реализации.Это понимание правильно?Подскажите, пожалуйста, как именно это сделать?

1 Ответ

0 голосов
/ 28 декабря 2018

Кажется, у вас есть две строки Product концепций здесь.Что вы можете сделать, это сделать BaseProduct и Account абстрактными и использовать дженерики.

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 и methodTwo из Account и реализуйте их в фактических классах «типа один» и «типа два»:

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()
...