Re: Как скрыть унаследованную переменную, и переопределить е
От: _FRED_ Черногория
Дата: 28.06.06 11:31
Оценка: +1
Здравствуйте, MaksaRz, Вы писали:

MR>Как в производном классе сделать переменную private, которая в родительском классе была pablic.


Никак
Help will always be given at Hogwarts to those who ask for it.
Re: Как скрыть унаследованную переменную, и переопределить е
От: pt4h Беларусь http://dzmitryhuba.blogspot.com/
Дата: 28.06.06 11:38
Оценка: +1
Здравствуйте, MaksaRz, Вы писали:

MR>Как в производном классе сделать переменную private, которая в родительском классе была pablic.

MR>делаю так
MR>
MR>    class Program
MR>    {
MR>        static void Main(string[] args)
MR>        {
MR>            Point2D ptA = new Point2D();
MR>            Point3D ptB = new Point3D();
MR>            Console.WriteLine("x = {0} y = {1} z = {2}", ptA.x, ptA.y, ptA.z);
MR>            Console.WriteLine("x = {0} y = {1} z = {2}", ptB.x, ptB.y, ptB.z);
MR>            Console.ReadKey();
MR>        }
MR>    }

MR>    class Point2D:Point3D 
MR>    {
MR>        private new double z=5;
MR>        public Point2D(){
MR>            x = 1;
MR>            y = 2;
MR>            z = 5;}
MR>    }

MR>    class Point3D
MR>    {
MR>        public double x, y, z;
MR>        public Point3D(){x = y =z = 0;}
MR>    }
MR>

MR>но z в Point2D остается public, так еще ей не присваивается значение 5, остается 0.

Возможно Вам необходимо изменить порядок наследования. Все же оно предназначено для унаследования общих аспектов, а в Вашем случае общее наследуется от частного.

То есть попробуйте унаследовать Point3D от Point2D.
Боишься — не делай, делаешь — не бойся.
Как скрыть унаследованную переменную, и переопределить ее.
От: MaksaRz  
Дата: 28.06.06 11:03
Оценка:
Как в производном классе сделать переменную private, которая в родительском классе была pablic.
делаю так
    class Program
    {
        static void Main(string[] args)
        {
            Point2D ptA = new Point2D();
            Point3D ptB = new Point3D();
            Console.WriteLine("x = {0} y = {1} z = {2}", ptA.x, ptA.y, ptA.z);
            Console.WriteLine("x = {0} y = {1} z = {2}", ptB.x, ptB.y, ptB.z);
            Console.ReadKey();
        }
    }

    class Point2D:Point3D 
    {
        private new double z=5;
        public Point2D(){
            x = 1;
            y = 2;
            z = 5;}
    }

    class Point3D
    {
        public double x, y, z;
        public Point3D(){x = y =z = 0;}
    }

но z в Point2D остается public, так еще ей не присваивается значение 5, остается 0.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Как скрыть унаследованную переменную, и переопределить е
От: Brn Россия  
Дата: 28.06.06 11:51
Оценка:
Здравствуйте, MaksaRz, Вы писали:

MR>Как в производном классе сделать переменную private, которая в родительском классе была pablic.


А вы уверены что вам необходимо наследование?


class Program
    {
        static void Main(string[] args)
        {
            Point2D ptA = new Point2D();
            Point3D ptB = new Point3D();
            Console.WriteLine("x = {0} y = {1} z = {2}", ptA.x, ptA.y);//, ptA.z);
            Console.WriteLine("x = {0} y = {1} z = {2}", ptB.x, ptB.y, ptB.z);
            Console.ReadKey();
        }
    }

    class Point2D
    {
        private Point3D abs;

        public double x
        {
            get { return abs.x; }
            set { abs.x = value; }
        }

        public double y
        {
            get { return abs.y; }
            set { abs.y = value; }
        }

        private new double z = 0;
        public Point2D(){
            abs = new Point3D();
            abs.x = 1;
            abs.y = 2;
            z = 5;}
    }

    class Point3D
    {
        public double x, y, z;
        public Point3D(){x = y =z = 0;}
    }
Re: Как скрыть унаследованную переменную, и переопределить е
От: MaksaRz  
Дата: 28.06.06 14:39
Оценка:
Данный кусок кода,я привел как простой пример:
Просто в одной книге(Петцольд — Программирование в тональности C#) я прочитал следующее — "Модификатор new по существу позволяет классу скрывать унаследованные члены и выполнять новые объявления"
private new double z=5;
т.е. это строчка как раз и должна была решить все проблемы.
Я новичок в ооп, и мне показалось что такая ситуация вполне реальна — что понадобится переопределить унаследованную переменную.
Так что заострять внимание именно на этом примере не следует.
З.Ы. Жалко что _FRED_ не как не аргументировал свой ответ. Похоже что так оно и есть, но почему же в книге пишется совсем обратное.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Как скрыть унаследованную переменную, и переопределит
От: pt4h Беларусь http://dzmitryhuba.blogspot.com/
Дата: 28.06.06 14:51
Оценка:
Здравствуйте, MaksaRz, Вы писали:

MR>Данный кусок кода,я привел как простой пример:

MR>Просто в одной книге(Петцольд — Программирование в тональности C#) я прочитал следующее — "Модификатор new по существу позволяет классу скрывать унаследованные члены и выполнять новые объявления"
MR>private new double z=5;
MR>т.е. это строчка как раз и должна была решить все проблемы.
MR>Я новичок в ооп, и мне показалось что такая ситуация вполне реальна — что понадобится переопределить унаследованную переменную.
MR>Так что заострять внимание именно на этом примере не следует.
MR>З.Ы. Жалко что _FRED_ не как не аргументировал свой ответ. Похоже что так оно и есть, но почему же в книге пишется совсем обратное.

17.2.2 The new modifier

A class-member-declaration is permitted to declare a member with the same name or signature as an
inherited member. When this occurs, the derived class member is said to hide the base class member. See
§10.7.1.2 for a precise specification of when a member hides an inherited member.

An inherited member M is considered to be available if M is accessible and there is no other inherited
accessible member N that already hides M.

Hiding an available inherited member is not considered an error, but it does cause the compiler to issue a
warning. To suppress the warning, the declaration of the derived class member can include a new modifier
to indicate that the derived member is intended to hide the base member. If one or more parts of a partial
declaration §17.1.4) of a nested type include the new modifier, no warning is issued if the nested type hides
an available inherited member.

If a new modifier is included


A declaration of a new member hides an inherited member only within the scope of the new member.
[Example:

class Base
{
public static void F() {}
}
class Derived: Base
{
new private static void F() {} // Hides Base.F in Derived only
}
class MoreDerived: Derived
{
static void G() { F(); } // Invokes Base.F
}

In the example above, the declaration of F in Derived hides the F that was inherited from Base, but since
the new F in Derived has private access, its scope does not extend to MoreDerived. Thus, the call F() in
MoreDerived.G is valid and will invoke Base.F. end example]

Боишься — не делай, делаешь — не бойся.
Re[2]: Как скрыть унаследованную переменную, и переопределит
От: _FRED_ Черногория
Дата: 29.06.06 07:31
Оценка:
Здравствуйте, MaksaRz, Вы писали:

MR>З.Ы. Жалко что _FRED_ не как не аргументировал свой ответ.


Сорри Но и ты никак не аргументировал применение используемого тобой способа Теперь вот понятно, что нужно оспорить и можно попробовать…

MR>Похоже что так оно и есть, но почему же в книге пишется совсем обратное.


Нет, книга не врёт: "Модификатор new" действительно "позволяет классу скрывать унаследованные члены и выполнять новые объявления", не упоминает лишь (сужу только по приведённой цитате) то, что "скрытие" применяется только при наличии конфликта имён, поэтому при объявлении закрытого поля в наследнике оно нужно, как как конфликтует с открытым полем предка, а вот "снаружи" открытое поле предка не конфликтует ни с кем, поэтому доступно. Модификатор new нужет не для сокрытия чего — либо, но для определения нового ("выполнять новые объявления"), что конфликтует по имени с унаследованным и модификаторы доступа совершенно тут ни-при-чём.
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Как скрыть унаследованную переменную, и переопределит
От: Аноним  
Дата: 29.06.06 23:37
Оценка:
ИМХО это упущение языка, в чем красота когда ставиш AnyStream.Flush(); и вылазят все флюши всех участвующих в наследовании классов.

------
Форум профессионалов


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.