Newb ie вопрос: Java класс имеет переменную-член, которая является типом интерфейса. Может кто уточнить? - PullRequest
1 голос
/ 13 июля 2020

Может ли кто-нибудь указать мне в правильном направлении. Я изучаю шаблон стратегии ( в википедии ), а в примере кода я кое-что не понимаю.

Строка с public IBillingStrategy Strategy что это?

class Customer {
    // Get/Set Strategy
    public IBillingStrategy Strategy { get; set; }  // <---- This confuses me

    public Customer(IBillingStrategy strategy) {
        this.drinks = new List<double>();
        this.Strategy = strategy;
    }
 // code that I omitted
}

interface IBillingStrategy {
    double GetActPrice(double rawPrice);
}

Я знаю, что вы не можете создавать экземпляры интерфейсов. И я знаю, что классы должны реализовывать интерфейсы с ключевым словом. Я понял, как это называется, и мне не удалось выполнить поиск в Google.

1 Ответ

4 голосов
/ 13 июля 2020

Во-первых, это не Java. Вы не можете написать такие методы установки геттера в Java: (Это C#)

public IBillingStrategy Strategy { get; set; }

Во-вторых, если вы прокрутите вниз, вы увидите реализации этого интерфейса:

class NormalStrategy : IBillingStrategy
{
    public double GetActPrice(double rawPrice) => rawPrice;
}

class HappyHourStrategy : IBillingStrategy
{
    public double GetActPrice(double rawPrice) => rawPrice * 0.5;
}

Так что это в основном шаблон кода для интерфейса . Это в основном означает, что вы разрабатываете свой класс Customer таким образом, чтобы экземпляр класса Customer мог содержать либо NormalStrategy, либо HappyHourStrategy в качестве переменной экземпляра.

Таким образом, если вы видите основной метод:

var firstCustomer = new Customer(normalStrategy);

Первый клиент - это клиент, имеющий NormalStrategy (не счастливый час).

В то время как второй клиент - это клиент, имеющий HappyHourStrategy.

Customer secondCustomer = new Customer(happyHourStrategy);

Итак под сомнение: Я знаю, что вы не можете создавать экземпляры интерфейсов.

Вы абсолютно правы. Так как это работает? Ответ таков: реализация вводится в ваш код через конструктор или вызов метода.

Здесь она вводится через конструктор.

var normalStrategy    = new NormalStrategy();
var firstCustomer = new Customer(normalStrategy);

Итак, ваш код знает об интерфейсе или абстрактный класс и может вызывать все, что определено в этом контракте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...