Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скрыть метод класса, при наследовании 
:(
    Опции темы
Дрон
Дата 23.10.2004, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Вот такая ерундовая возникла проблема. А времени разбираться самому нет :(
Допустим у меня есть класс
Код

class Test
{
   public void TestMethod(int param)
   {
   }
}

Я пронаследовал от него другой класс и хочу, чтобы для объектов нового класса TestMethod стал private или был бы вообще недоступен.

Как это сделать?


--------------------
Да. Именно так.
PM   Вверх
stab
Дата 23.10.2004, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



хе-хе

http://forum.vingrad.ru/index.php?showtopic=30483

если найдешь способ отличный от обертки дай знать пожалста


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Mad
Дата 23.10.2004, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 1
Всего: 19



Полностью спрятать нельзя, но можно ограничить доступ к ним :
Код

class Parent
{
   public virtual void Test(int param)
   {
   }
}

class Child : Parent
{
   public override void Test(int param)
   {
       // Это код будет вызыватся при любом уровне наследования
   }
}




--------------------
user posted image
PM MAIL   Вверх
Дрон
Дата 23.10.2004, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Mad
Согласен. Но это не слишком хорошо.


--------------------
Да. Именно так.
PM   Вверх
Mad
Дата 23.10.2004, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 1
Всего: 19



Дрон
В каком смысле хорошо ? :)


--------------------
user posted image
PM MAIL   Вверх
Дрон
Дата 23.10.2004, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Цитата(Mad @ 23.10.2004, 16:23)
В каком смысле хорошо ?

У меня в базовом есть метод Send(object param)
Я пронаследовал от него и хочу, чтобы был новый метод Send(Message param).
Т.е., чтобы можно было посылать только объекты класса Message.
Оставлять видимым метод с параметром типа object я вообще не хочу.


--------------------
Да. Именно так.
PM   Вверх
Mad
Дата 23.10.2004, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 1
Всего: 19



Дрон
Ну так напиши :
Код

class Parent
{
   public virtual void Send(object param)
   {
   }
}

class Child
{
   public override void Send(object param)
   {
        if (param.GetType().ToString() == "Message")
        {
            // отправляем Message
        }
        else
            base.Send(param); // или вообще ничего не делаем, или выбрасываем какойто Exception
   }
}




--------------------
user posted image
PM MAIL   Вверх
Дрон
Дата 23.10.2004, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Mad
А зачем людей с толку сбивать?
Если есть метод с параметром object, то и работать он должен для любого объекта...

Только чего-то мы от темы немного отклонились :)


--------------------
Да. Именно так.
PM   Вверх
Mad
Дата 23.10.2004, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 1
Всего: 19



Дрон
В .NET все обьекты являются наследниками от object :)

Цитата
А зачем людей с толку сбивать?
Если есть метод с параметром object, то и работать он должен для любого объекта...

А прятать методы родительского класса это как ;-)



--------------------
user posted image
PM MAIL   Вверх
Дрон
Дата 23.10.2004, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Раз уж пошёл такой разговор...

Прятать методы -- это как раз, чтобы уберечь от возможных ошибок. Моим классом будут пользоваться другие люди. И что же я каждому из них должен буду объяснять -- вот этим методом пользуйся, а вот этим не пользуйся.

Похоже всё-таки прийдётся писать wrapper :stena


--------------------
Да. Именно так.
PM   Вверх
Mad
Дата 23.10.2004, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 1
Всего: 19



Дрон
Ну, так определи в родителе метод как protected и все :)

Добавлено @ 18:19
Цитата
Моим классом будут пользоваться другие люди. И что же я каждому из них должен буду объяснять -- вот этим методом пользуйся, а вот этим не пользуйся.

Кслати, адля чего по твоему документация API состовляется :)


--------------------
user posted image
PM MAIL   Вверх
Дрон
Дата 23.10.2004, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Цитата(Mad @ 23.10.2004, 19:15)
Ну, так определи в родителе метод как protected и все
А это мысль :)
Но с другой стороны мне не хочется менять родительский класс, ибо писал его не я.

Короче, из любой проблемы можно найти выход.
Другое дело, что выход этот иногда через жопу. Поэтому я и хотел спросить -- а нет ли стандартных средств.
Видимо, нет :)

Это сообщение отредактировал(а) Дрон - 23.10.2004, 18:59


--------------------
Да. Именно так.
PM   Вверх
Mad
Дата 23.10.2004, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 1
Всего: 19



Дрон
Стандартных действительно нет, и не может быть.
Чтобы полностью закрыть доступ, тебе надо убрать указатель из vtabl,
тем самым убрать этот метод и из родителя тоже.


--------------------
user posted image
PM MAIL   Вверх
Дрон
Дата 23.10.2004, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Цитата(Mad @ 23.10.2004, 20:03)
Стандартных действительно нет, и не может быть.

Меня немного смущает то, что в MSDN написано:
Цитата
A derived type can hide an inherited member by defining a new member with the same signature. This might be done to make a previously public member private or to define new behavior for an inherited method that is marked as final.



--------------------
Да. Именно так.
PM   Вверх
Mad
Дата 23.10.2004, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 1
Всего: 19



Дрон
Если ты так сделаеш:
Код

class Parent
{
   public void Test(object parm)
   {
   }
}

class Child : Parent
{
   protected new void Test(object parm)
   {
   }
}

тогда Parent.Test будет public
а Child.Test будет protected

Правда вот такой код:
Код

Parent parent = new Parent();
Child child = new Child();

int arg = 0;
parent.Test(arg);
Child.Test(arg);

не только компилится буз ошидок и варнингов, но и в обеих случаях вызавает метод Parent.Test :(



--------------------
user posted image
PM MAIL   Вверх
Дрон
Дата 23.10.2004, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Да это я уже понял...


--------------------
Да. Именно так.
PM   Вверх
Mad
Дата 24.10.2004, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 1
Всего: 19



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

И кстати, если писал класс не ты, то и не тебе прятать его функции :p


--------------------
user posted image
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0667 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.