Должно ли Inherit package-private field или создавать private во всех подклассах? - PullRequest
0 голосов
/ 24 ноября 2018

У меня проблемы с пониманием наследования некоторых полей классов.В случае поля, которое есть во всех подклассах, но отличается во всех них, как мне его кодировать?

Должен ли я кодировать так:

class Product {
    private String name;
    double tax;

    Product(String name) {
        this.name = name;
    }
}

class CarProduct extends Product {
    CarProduct(String name) {
        super(name);
        this.tax = 0.2;
    }
}

class PharmacyProduct extends Product {
    PharmacyProduct(String name) {
        super(name);
        this.tax = 0.05;
    }
}

Или вот так?Что является более правильным?

class Product {
    private String name;

    Product(String name) {
        this.name = name;
    }
}

class CarProduct extends Product {
    private double tax;

    CarProduct(String name) {
        super(name);
        this.tax = 0.2;
    }
}

class PharmacyProduct extends Product {
    private double tax;

    PharmacyProduct(String name) {
        super(name);
        this.tax = 0.05;
    }
}

Обновление после комментария @JB Nizet, Я изменил способ установки значения налога для каждого подкласса:

class Product {
    private String name;
    private double tax;

    Product(String name) {
        this.name = name;
    }

    setTax(double tax) {
        this.tax = tax;
    }
}

class CarProduct extends Product {
    CarProduct(String name) {
        super(name);
        this.setTax(0.5);
    }
}

class PharmacyProduct extends Product {
    PharmacyProduct(String name) {
        super(name);
        this.setTax(0.05);
    }
}

Это лучше, чем предыдущие два?

1 Ответ

0 голосов
/ 24 ноября 2018

Если налог является общим свойством, которым должны обладать все продукты (что имеет смысл для меня, но зависит от вашего точного варианта использования), я бы оставил член tax в базовом классе, а наследующие классы передавали бы егозначения для базового конструктора:

class Product {
    private String name;
    double tax;

    Product(String name, double tax) {
        this.name = name;
        this.tax = tax;
    }
}

class CarProduct extends Product {
    CarProduct(String name) {
        super(name, 0.2);
    }
}

class PharmacyProduct extends Product {
    PharmacyProduct(String name) {
        super(name, 0.05);
    }
}
...