C++ позволяет изменять уровень доступа к членам в производном классе в любую сторону, Java — только в сторону повышения уровня доступа, а C# — не позволяет вообще.
Понятно, что этим Java обеспечивает возможность рассматривать любой объект производного класса как объект базового класса, C++ — свободу программиста, а вот почему C# не позволяет изменять уровень доступа в сторону повышения, мне не ясно.
Кроме того было бы интересно узнать, как осмысленно можно применить понижение (в C++) и повышение (в C++ и Java) уровня доступа?
igna wrote: > C++ позволяет изменять уровень доступа к членам в производном классе в > любую сторону
Не совсем так. В С++ механизмы контроля доступа и виртуальных функций —
независимы.
Здравствуйте, igna, Вы писали:
I>Кроме того было бы интересно узнать, как осмысленно можно применить понижение (в C++) и повышение (в C++ и Java) уровня доступа?
Джава:
java.lang.Object(), метод clone() имеет модификатор доступа protected ==> если мы хотим предоставить клиенту, работающему с объектом нашего класса(неявно унаследованного от Object), возможность получить копию нашего объекта с помощью интерфейса, предусматриваемого стандартной библиотекой(clone()), мы должны переопределить этот метод с повышением модификатора доступа. Т.е. если клент видит, что в нашем классе присутствует public clone(), он знает, что создатель класса позаботился о правильной реализации клонирования. Конечно, альтернативой всему этому выступает написание метода типа makeClone() и забивание на Object.clone(), но другого применения повышения модификатора доступа не знаю
Здравствуйте, Nikolay_Ch, Вы писали:
N_C>Почему? Вроде позволяет...
А тут (см. ниже) о чем?:
17.5.4 Override methods
. . .
• The override declaration and the overridden base method have the same declared accessibility. In other
words, an override declaration cannot change the accessibility of the virtual method.
. . .
(C# Language Specification, 3rd Edition / June 2005)
Re[2]: Изменение уровня доступа в производном классе
N_C>>Почему? Вроде позволяет... I>А тут (см. ниже) о чем?: I>
I>• The override declaration and the overridden base method have the same declared accessibility. In other
I>words, an override declaration cannot change the accessibility of the virtual method.
Так это идет речь о виртуальных методах. А в обычных — пожалуйста — переопределяй, как хочешь.
public class Class1
{
protected void qqq()
{
}
}
public class Class2 : Class1
{
public new void qqq()
{
}
}
Re[4]: Изменение уровня доступа в производном классе
I>При помощи new можно и виртуальный "переопределить":
Но по сути это же будет переопределение. Чем грозит переопределение через new в невиртуальных функциях?
Re[6]: Изменение уровня доступа в производном классе
N_C>>Но по сути это же будет переопределение. I>Сокрытие.
С такой точки зрения, тогда C# вообще не позволяет переопределять методы, за исключением виртуальных.
Хотя MSDN говорит:
Hiding an inherited member means that the derived version of the member replaces the base-class version.
Значит все-таки метод заменяет базовый метод...
Re[3]: Изменение уровня доступа в производном классе
igna wrote: > C>Не совсем так. В С++ механизмы контроля доступа и виртуальных функций > — независимы. > Я вот о чем
Ну так я именно это и имею в виду. В С++ биндинг виртуальных функций
идет по имени (и не включает в себя контроль доступа).
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[4]: Изменение уровня доступа в производном классе
igna wrote: > А почему "C++ позволяет изменять уровень доступа к членам в производном > классе в любую сторону" это "не совсем так"?
Он не меняет доступ — он просто на него не смотрит
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[6]: Изменение уровня доступа в производном классе
Здравствуйте, Cyberax, Вы писали:
>> А почему "C++ позволяет изменять уровень доступа к членам в производном классе в любую сторону" это "не совсем так"?
C>Он не меняет доступ — он просто на него не смотрит
И фраза вроде "The access of a member of a base class can be changed in the derived class" не имеет смысла?
class A {
public:
void f() {}
};
class B: public A {
private:
using A::f;
};
int main()
{
B b;
b.f(); // Ошибка, доступ к приватному члену
((A&)b).f(); // ОК, отсюда смонительная польза возможности понижения уровня доступа к производных классах,
// раз это все равно можно обойти при желании
}
Кстати к Java еще можно добавить Delphi, он тоже позволяет только повышать уровень доступа.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[2]: Изменение уровня доступа в производном классе
Здравствуйте, bolshik, Вы писали:
B>Джава: B>java.lang.Object(), метод clone() имеет модификатор доступа protected ==> если мы хотим предоставить клиенту, работающему с объектом нашего класса(неявно унаследованного от Object), возможность получить копию нашего объекта с помощью интерфейса, предусматриваемого стандартной библиотекой(clone()), мы должны переопределить этот метод с повышением модификатора доступа. Т.е. если клент видит, что в нашем классе присутствует public clone(), он знает, что создатель класса позаботился о правильной реализации клонирования. Конечно, альтернативой всему этому выступает написание метода типа makeClone() и забивание на Object.clone(), но другого применения повышения модификатора доступа не знаю
С Java плохо знаком, но вроде у метода clone есть и еще одна особенность — он кидает исключение CloneNotSupportedException, если поддержка клонирования актуальным классом объекта не поддерживается. Зачем спрашивается такая двойная защита — через уровень доступа и исключения?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde