[Java] Вассал моего вассала или Наследование

feliks28

Если есть три класса A, B и C, причем C extends B и B extends A, то может ли класс C получить доступ к закрытым переменным и методам класса A?
Если может то как? Первоприходящее в голову super.super.метод не работает.

yolki

А что, даже прямой потомой наследует private методы и поля родитля?

Natasha_fR

Переменные и методы объявленные как private не доступны вне класса(в том числе и в подклассах)

feliks28

Мда, что-то я с утра про закрытые классы лишнего написал...
Не закрытые конечно, но интересует есть ли синтаксис чтобы в этом случае писать не A.[метод], а что-то типа superofsuper.[метод]?

Hastya

super.super - такой вызов невозможен.
а теперь можешь сам подумать, почему.

feliks28

Интересно, почему я не удивлен?

Hastya

Ну, хотя бы потому, что наличие таких вызовов свидетельствует о плохо организованной иерархии.
Еще проблема компиляции таких вызовов.

feliks28

Кхгм... Ну ладно проехали...
А по существу вопроса есть что?

Dasar

пример, в виде, кода приведи - тогда будет проще ответить

feliks28

Ну вот например


class Worker
{
Worker(String _name, double _salary)
{
name = _name;
salary = _salary;
}
public String getName
{
return name;
}
public double getSalary
{
return (1 - salaryTax * salary;
}
public void setSalary(double _salary)
{
salary = _salary;
}
private double salaryTax
{
return 0.05;
}
private String name;
private double salary;
}
class Manager extends Worker
{
Manager(String _name, double _salary)
{
super(_name, _salary);
bonus = 0;
}
public double getSalary
{
return super.getSalary + (1 - bonusTax * bonus;
}
public void addBonus(double _bonus)
{
bonus += _bonus;
}
protected double getBonus
{
return bonus;
}
private double bonusTax
{
return 0.07;
}
private double bonus;
}
class Boss extends Manager
{
Boss(String _name, double _salary)
{
super(_name, _salary);
}
public double getSalary
{
return 0; //Worker.getSalary + super.getBonus; <- Только не надо мне писать что это не работает, я просто для наглядности написал.
}
}


Пара примечаний : A, B и C - это теперь Worker, Manager и Boss соответственно.
Чего хочу: чтобы в такой реализации можно было из класса Boss узнать зарплату без бонуса, например чтобы не начислять налог на бонус.

Dasar

архитектурная ошибка
getSalary - неявно используется для обозначения двух разных вещей:
1. Ставки оклада
2. Кол-во денег выплачиваемое сотруднику.

feliks28

Согласен, но смысл вопроса то теперь ясен, я надеюсь?
Меня вообще возможность обращения к суперклассу суперкласса интересует.

dedwowan

Тут попробовали сделать super.super - оказалось работает )
Вернее IDEA на это ругаться не стала.
А вообще я бы метод перегрузил.
Оставить комментарий
Имя или ник:
Комментарий: