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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как скрыть методы базового класса, например ToString() или GethashCode() 
:(
    Опции темы
GRIENDERS
Дата 27.1.2008, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 19.2.2007

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



Есть класс MyClass, естественно наследник класса Object. Можно ли скрыть (не переопределить логику работы, а именно скрыть) методы базового класса, например ToString(), чтобы у объектов MyClass после точки они не появлялись:

Код

MyClass my_object =new MyClass();
my_object.ToString(); //ошибка, метода ToString() нет, либо он не публичный, либо еще что - нибудь



Я понимаю, что модификатор доступа нельзя изменить, но у какого-то класса я такое видел, хотя м.б он был статическим? Не помню уже.

Это сообщение отредактировал(а) GRIENDERS - 27.1.2008, 15:51
PM MAIL   Вверх
marcusmae
Дата 27.1.2008, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

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



GRIENDERS, нет, при наследовании скрыть члены базового класса нельзя. Впрочем, можно не наследовать, а агрегировать :

Код

class A { ... }

class B { private A a; ... }


и все члены класса A, которые должны быть видны, завернуть в обёртки класса B :

Код

class A { public void foo1() {...} public void foo2() {...} ... }

class B { private A a; public void foo1() { this->a->foo1(); } ... }


Но в случае с Object это не подходит, поскольку все классы неявно наследуются от Object smile А чем, если не секрет, так стыден метод ToString()?

Это сообщение отредактировал(а) marcusmae - 27.1.2008, 16:02


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
farad
Дата 27.1.2008, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 1.11.2007

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



ToString есть у всех типов .NET.. его можно только переопределить,а больше ничего не сделать
PM MAIL   Вверх
_Jesus
Дата 28.1.2008, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 16.1.2008

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



Можешь посмотреть в сторону sealed.
PM MAIL   Вверх
GRIENDERS
Дата 28.1.2008, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 19.2.2007

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



_Jesus, интересно как?
PM MAIL   Вверх
arilou
Дата 30.1.2008, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


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

Репутация: 21
Всего: 61



GRIENDERS, 

Код

class A
{
    private new String ToString()
   {
   }
}


только имей ввиду, что этот ToString будет вызываться только, если ты будешь обращаться к нему через 

Код

A a = new A();
a.ToString(); // ошибка, ToString - private

object b = a;
b.ToString(); // вызовается Object.ToString()


Только так.


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
GRIENDERS
Дата 31.1.2008, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 19.2.2007

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



arilou, не работает - из класса А можно обратиться к ToString(), хотя он и будет вызывать метод  ToString класса object
Но все равно a.ToString() - ошибки НЕТ, компилируется и работает нормально
PM MAIL   Вверх
KLUBS
Дата 31.1.2008, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



а что если переопределить ToString() и вызывать исключение?? тогда никто не убдет его использовать)))
PM MAIL ICQ Skype   Вверх
arilou
Дата 31.1.2008, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


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

Репутация: 21
Всего: 61



Цитата(GRIENDERS @  31.1.2008,  20:04 Найти цитируемый пост)
rilou, не работает - из класса А можно обратиться к ToString(), хотя он и будет вызывать метод  ToString класса object
Но все равно a.ToString() - ошибки НЕТ, компилируется и работает нормально 

Действительно, я был не прав. Признаю. Хотя казалось, что вроде так было...

Ну тада возвращаемся к первому вопросу, а зачем оно надо? smile Можно определить методы в интерфейсе, а в классе их реализовать explicitly, тогда их не будет видно, если явно не приведешь объект к типу интерфейса.


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
mr.DUDA
Дата 1.2.2008, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

Репутация: 110
Всего: 232



С explicitly реализацией тоже не катит, всё равно intellisence упорно показывает что методы есть, а при выполнении не вызываются методы из реализованного интерфейса. Похоже это фича дотнета такая.


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


Эксперт
***


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

Репутация: 63
Всего: 170



Закрыть методы базового класса нельзя
Скрыть (hide) методы базового класса новой реализацией метода? Но для этого существуют виртуальные методы, 
Цитата(GRIENDERS @  27.1.2008,  14:50 Найти цитируемый пост)
чтобы у объектов MyClass после точки они не появлялись

да и после точки они появятся. smile

Можно не наследоваться, а агрегироваться, как говорилось ранее. Тогда проблема решается.

Интерфейсы, как я понимаю, это немного не к этой ситуации. Есть определенная функциональность класса, доступная для всех, а один клиент класса намерен эту доступность отменить. 

Это не прерогатива клиента, сорри smile 




--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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