Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > переопредедение переменной в классе


Автор: Rays 9.8.2010, 19:40
Доброго времени суток!
Помогите разобратся с проблемой: 
Имеется класс "1", в котором объявляется переменная "x" и дальше используется в методе этого класса. Есть класс "2", производный от класса "1", в котором тоже объявляется переменная "х", которая тоже должна использоваться в методе класса "1". Но, т.к. в классе "1" уже есть переменная "х" - она ее переопределяет. Подскажите, как сделать так, что бы переменная "х" класса "2" оставалась?

Вот что пишет студия:
2.х скрывает наследуемый член 1.х. Если предполагается скрытие, используете ключевое слово new. 

Эм.. куда его использовать?)) Я пробовал - не помогает, все-равно переопределяет значение переменной.

Автор: azesmcar 9.8.2010, 19:46
Цитата(Rays @  9.8.2010,  19:40 Найти цитируемый пост)
Есть класс "2", производный от класса "1", в котором тоже объявляется переменная "х", которая тоже должна использоваться в методе класса "1". 

Чего? Откуда метод класса 1 знает о переменной, объявленной в наследнике этого класса?

а код ты из принципиальных соображений не показываешь, чтобы задачу усложнить?

Автор: Rays 9.8.2010, 19:55
Цитата(azesmcar @  9.8.2010,  19:46 Найти цитируемый пост)
Чего? Откуда метод класса 1 знает о переменной, объявленной в наследнике этого класса?

Хм.. т.е. так нельзя сделать?)) Ну ладно, плохо...)
Вот код, но думаю, он уже не нужен:
Код

class main_helm_desert
    {   int Str, Dex, Int_n, Sta, Acc, Int_t; 
        bool Check1;
        protected int str_take = 35, dex_take=0, int_n_take = 40, sta_take=0, acc_take = 26, int_t_take = 15 ;
        protected int str_give = 0, dex_give = -4, int_n_give = 10, sta_give = 0, acc_give = 10, int_t_give = 7;
       
        public void check (int str, int dex, int int_n, int sta, int acc, int int_t)
        {
            if (str >= str_take & dex >= dex_take & int_n >= int_n_take & sta >= sta_take & acc >= acc_take & int_t >= int_t_take)
            {
                Str = str + str_give;
                Dex = dex + dex_give;
                Int_n = int_n + int_n_give;
                Sta = sta + sta_give;
                Acc = acc + acc_give;
                Int_t = int_t + int_t_give;
                Check1 = true;
            }
            else
                Check1=false;
        }
        public int renew_str()
        {
            return Str;
        }
        public int renew_dex()
        {
            return Dex;
        }
        public int renew_int_n()
        {
            return Int_n;
        }
        public int renew_sta()
        {
            return Sta;
        }
        public int renew_acc()
        {
            return Acc;
        }
        public int renew_int_t()
        {
            return Int_t;
        }
        public bool renew()
        {
            return Check1;
        }

    }

    class armor_desert : main_helm_desert
    {
        int str_take = 45, dex_take = 45, int_n_take = 0, sta_take = 60, acc_take = 0, int_t_take = 0;
        int str_give = 7, dex_give = -5, int_n_give = 0, sta_give = 1, acc_give = 9, int_t_give = 0;
    }

Смысл в том, что бы подставлять разные значения перпеменных в один и тот же метод.

Автор: azesmcar 9.8.2010, 20:19
Цитата(Rays @  9.8.2010,  19:55 Найти цитируемый пост)
Хм.. т.е. так нельзя сделать?)) Ну ладно, плохо...)

А откуда базовому классу знать о своих потомках?

Цитата(Rays @  9.8.2010,  19:55 Найти цитируемый пост)
Смысл в том, что бы подставлять разные значения перпеменных в один и тот же метод. 

хм..я чего-то не понимаю? чем передача параметров не устраивает?

Автор: mrbrooks 10.8.2010, 07:56
Цитата(azesmcar @  9.8.2010,  21:19 Найти цитируемый пост)
хм..я чего-то не понимаю?

может он имеет ввиду разные типы данных?

Автор: azesmcar 10.8.2010, 08:00
Цитата(mrbrooks @  10.8.2010,  07:56 Найти цитируемый пост)
может он имеет ввиду разные типы данных? 

может быть smile 

откровенно говоря код я не осилил, но тогда ему нужно не наследование а generic.

Автор: mrbrooks 10.8.2010, 08:02
так или иначе - но в таких темах нужен мелафон  smile 

Автор: ДобренькийПапаша 10.8.2010, 10:54
Цитата(azesmcar @  10.8.2010,  08:00 Найти цитируемый пост)
откровенно говоря код я не осилил, но тогда ему нужно не наследование а generic. 


Ещё бы, когда видишь такой код на С++ это нормально, но когда видишь такой код под .NET это вызывает удивление, поскольку человек не читает спецификацию и не в курсе, что благодаря Intellisense основанному на работе с метаданными можно давать нормальные имена переменным и не стесняться их делать длинными (и понятными)  smile 

Автор: azesmcar 10.8.2010, 11:00
Цитата(ДобренькийПапаша @  10.8.2010,  10:54 Найти цитируемый пост)
Ещё бы, когда видишь такой код на С++ это нормально

Это ненормально на любом языке..ну может разве что на branfuck-e?!

Автор: Amp 10.8.2010, 12:21
Цитата(azesmcar @  10.8.2010,  11:00 Найти цитируемый пост)
Это ненормально на любом языке..ну может разве что на branfuck-e?! 

Мне кажется, что для реализации математических алгоритмов это нормально. Есть набор формул в литературе с устоявшимися специфическими короткими именами переменных (которые даже могут не нести никакой смысловой нагрузки, например имена каких-либо коэффициентов - a, b, c) - почему бы не перенести это в код? Другой человек, имея соответствующую подготовку, достаточно быстро вникнет в такой код, быстро соотнеся его с изложенными формулами в статьях. 

Автор: Mephisto 10.8.2010, 12:52
Цитата(ДобренькийПапаша @  10.8.2010,  11:54 Найти цитируемый пост)
Ещё бы, когда видишь такой код на С++ это нормально, но когда видишь такой код под .NET это вызывает удивление, поскольку человек не читает спецификацию и не в курсе, что благодаря Intellisense основанному на работе с метаданными можно давать нормальные имена переменным и не стесняться их делать длинными (и понятными)

брррр. Причем тут спецификация .NET и Intellisense? Одно дело платформа, другое приблуда к студии MS. Под .NET пожно писать и на шарпдевелопе и на монодевелопе, да и в любом блокноте, даже в консольном. Никаких Intellisense'ов там не будет. В других студиях другие средства заменяющие его, иногда даже лучше.

А еще мне не понятно почему в С++ нельзя, дословно
Цитата(ДобренькийПапаша)

давать нормальные имена переменным и не стесняться их делать длинными (и понятными)

И Intellisense тут ни при чем. Я пользуюсь KDevelop. Начиная с версии 4 у него навигация и автопостроение документации ИМХО на голову выше при работе с С++.
Очень сильно напоминает работу в студии с установленным ReSharper. Кто использует, тот понимает.
Цитата(Rays @  9.8.2010,  20:40 Найти цитируемый пост)
Я пробовал - не помогает, все-равно переопределяет значение переменной. 

Это нормально. Два поля с одинаковым названием не бывает в нете.
Да и в плюсах это по хорошему дурной тон. Поддержка такой фичи появилась как следствие поддержки двойного наследования, когда возможно появление двух полей с одинаковым именем и разным назначением. Только из-за этого и появился механизм разрешения коллизий одинаковых имен.
В .net ситуация иная. Тут нет двойного наследования. Соответственно поле с одним названием должно быть одно единственное и нести однозначный смысл. Поэтому если ты определяешь в потомке св-во с тем же именем что и в предке, ты таким образом заменяешь св-во предка по сути.

Можно разве что сделать определенное поле предка вируальным.
Код

protected virtual int SomeProperty { get; set; }

и переопределить его в потомке.

Автор: Rays 10.8.2010, 15:30
Цитата(Mephisto @  10.8.2010,  12:52 Найти цитируемый пост)
Можно разве что сделать определенное поле предка вируальным.

Хм.. Если я все правильно сделал, то не получается. 
Попробую сделать через params - но код переделывать придется + хз что в итоге получится))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)