Как изменить клиента на другое членство?Джава - PullRequest
1 голос
/ 28 декабря 2010

Я пытаюсь изучить наследование и интерфейс в Java.У меня есть три разных класса: Customer, SilverCustomer и GoldCustomer.И SilverCustomer, и GoldCustomer расширяют возможности Customer.

В приложении клиент получает баллы за поездки.Обычный клиент получает пробег, который он проезжает в баллы.SilverCustomer получает пробег * 1,5, а GoldCustomer получает пробег * 2 балла.

Когда я создаю обычного клиента John, как я могу переключаться между обычным клиентом, silvercustomer и goldcustomer с помощью метода downgrade () и upgrade ()?

class Testfile {
     public static void main(String[] args) {

         Airline aProgram = new Airline();

         Customer john = new Customer("john", 10001); // 10001 is the id number and the status of a customer is normal

         aProgram.addMembers(john);

    john.update_mileage(12000);
    john.upgrade(); //upgrade John to SilverCustomer
    john.update_mileage(2000);

     aProgram.printAllCustomerMilege(); 
   }
}

Ответы [ 5 ]

5 голосов
/ 28 декабря 2010

Вы не можете изменить класс объекта, как только он был создан.

Если ваша логика зависит от типа вашего клиента, вы можете использовать шаблон проектирования Стратегии.В вашем примере вы можете написать что-то вроде этого:


interface Strategy {
    double getMileageCoefficient();
}
class NormalCustomerStrategy implements Strategy {
    public double getMileageCoefficient() {
        return 1.0;
    }
}
class GoldCustomerStrategy implements Strategy {
    public double getMileageCoefficient() {
        return 2.0;
    }
}

В вашем классе Customer будет личное поле Strategy strategy; Тогда ваш метод обновления будет выглядеть так:И метод обновления пробег:


void upgradeMileage(double mileage) {
    this.mileage += strategy.getMileageCoefficient() * mileage;
}

2 голосов
/ 28 декабря 2010

Как уже упоминалось, шаблон разработки стратегии , а не наследование, - это путь.При использовании этого шаблона вам даже не нужно создавать классы клиентов (Normal, Silver, Gold), потому что стратегия может также обрабатывать методы понижения и обновления:

public interface MileageCalculator
{
    double getMileage(int miles);
    MileageCalculator upgrade();
    MileageCalculator downgrade();
}

public class NormalMileageCalculator implements MileageCalculator
{
    public double getMileage(int miles)
    {
        return miles;
    }

    MileageCalculator upgrade()
    {
        return new SilverMileageCalculator();
    }

    MileageCalculator downgrade()
    {
        return this;
    }
}

public class SilverMileageCalculator implements MileageCalculator
{
    public double getMileage(int miles)
    {
        return miles * 1.5;
    }

    MileageCalculator upgrade()
    {
        return new GoldMileageCalculator();
    }

    MileageCalculator downgrade()
    {
        return new SilverMileageCalculator();
    }
}

// The same for GoldMileageCalculator

class Customer
{
    private MileageCalculator calculator = new NormalMileageCalculator();
    private double mileage;

    public void upgrade()
    {
        calculator = this.calculator.upgrade();
    }

    public void downgrade()
    {
        calculator = this.calculator.downgrade();
    }

    public void update_mileage(int miles)
    {
        this.mileage += calculator.getMileage(miles);
    }
}
2 голосов
/ 28 декабря 2010

Ваша структура наследования предполагает, что Клиент никогда не изменит тип.Единственный способ «изменить» тип - это удалить старый объект Customer и создать новый.

Лучше всего иметь один класс Customer и поле CustomerType, которое можно изменить.

enum CustomerType {
    Standard(1.0), Silver(1.5), Gold(2.0);
    final double pointsRate;
    public CustomerType(double pointsRate) { this.pointsRate = pointsRate; }
}

class Customer {
    CustomerType customerType;

    public void upgrade() {
        switch(customerType) {
            case Standard: customerType = CustomerType.Silver; break;
            case Silver: customerType = CustomerType.Gold; break;
        }
    }
}
1 голос
/ 28 декабря 2010

Это тот случай, когда наследование не является решением. Я бы порекомендовал один класс Customer с полем типа, содержащим перечисление.

Если вы все еще хотите сделать это с наследованием, то единственный способ сделать это - скопировать ваши данные в новый объект. Возможно, метод upgrade () может вернуть новый объект. Затем вам нужно обновить ссылки (например, в списке), чтобы они указывали на новый объект.

1 голос
/ 28 декабря 2010

Похоже, это не должно быть реализовано в наследстве.Если ваши клиенты могут быть «модернизированы» или «понижены», тогда отношения «действительно» не поддерживаются.Наследование следует использовать, когда объект НАСЛЕДСТВЕННО отличается от своего родителя.

Например, class dog extends animal is-a class animal.Вы бы не сказали, что можете «улучшить» собаку до животного, потому что собака - это животное.

Что касается вашего вопроса, вам нужно просто иметь переменную-член "type", в которой вы сохраняете тип клиента, которого он (обычный, серебряный, золотой).

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