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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не Generic ли случаем поможет? 
:(
    Опции темы
Хоббит
Дата 28.6.2006, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

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



Есть базовый класс

class BaseElement
{
,,, описание
}

Есть семейство его элементов

class BaseElementCollection : CollectionBase
{
 ...
 Add(BaseElement);
 Remove(BaseElement);

  public BaseElement this[index]{}
 ...
}

Вот теперь в программе я создаю свой класс допустим

class Group : BaseElement
{
  Остальные поля
  string name; и.т..д
}

И семейство 
class GroupCollection : BaseElementCollection
{
доп методы, поля и.т.д.
}

Можно ли сделать так что бы методы индексаторы и.т.д. класса GroupCollection возвращали и приниамли элемент Group а не BaseElement
(что бы не приходилось постоянно преобразовывать данные)


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


Опытный
**


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

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



Код

class GroupCollection : BaseElementCollection
{
  public new GroupElement this[index]{}
доп методы, поля и.т.д.
}

 


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

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



то есть предлагаешь все переопределить? а зачем .... индексатор ладно
а вот в метода Add Remove у меня ведется большая доп обработка, которая будет одинаковая для всех классов... только вот с ней гемороиться не охота

Конечно можно добавить перегруженные методы, которые будут вызывать базовые????? 
PM MAIL   Вверх
Mad
Дата 28.6.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Хоббит @  28.6.2006,  12:38 Найти цитируемый пост)
Конечно можно добавить перегруженные методы, которые будут вызывать базовые?????  

это я и имел в виду
тем более потом будет легко добавить доп обработку, специфическую для каждого класса 


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


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


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

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



Единственное, что надо иметь ввиду, что если добавите new, то можеть быть проблема:

Код

class A
{
  public virtual void foo() {};
}

class B : A
{
  public override void foo() {}
}

class C : B
{
  public new void foo() {}
}

void Main()
{
  A a1= new B();
  A a2= new C();
  C c1 = new C();

  a1.foo(); // вызовется B.foo()
  a2.foo(); // вызовется A.foo()
  c1.foo(); // вызовется C.foo()
}


имейте ввиду  smile  


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

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



осталось только авторитетного мнения мистера Дуды дождаться 
PM MAIL   Вверх
arilou
Дата 28.6.2006, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Хоббит, можно еще через generics сделать:

Код

class BaseElementCollection<T> : CollectionBase
  where T: BaseElement // ограничиваем хранимые объекты только BaseElement и его производными
{
 public void Add(T element);
 public void Remove(T element);

  public T this[int index]{}
 ...
}

class GroupCollection : BaseElementCollection<Group>
{}
 


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

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



во то что я хотел ...

кстати а конструктор базового класса сам запускается? при запуске конструктора производного класаа? или что то я это логики не пойму...
или его надо отдельно вызвать через base 
PM MAIL   Вверх
mr.DUDA
Дата 28.6.2006, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Хоббит @  28.6.2006,  15:51 Найти цитируемый пост)
кстати а конструктор базового класса сам запускается? при запуске конструктора производного класаа?

Не вызывается. Нужно через base вызывать smile 


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


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


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

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



Цитата(mr.DUDA @  28.6.2006,  16:09 Найти цитируемый пост)
Не вызывается. Нужно через base вызывать 

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


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

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



вот указал я в заголовке это <T> а тепрь в теле класса я могу создать обьект типа T или хотя бы преобразовать один обьект в тип T 
PM MAIL   Вверх
arilou
Дата 28.6.2006, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Хоббит, конечно можешь. Тока надо уточнить, что T - ссылочный тип:

Код

class BaseElementCollection<T> : CollectionBase
  where T: BaseElement, new() // ограничиваем хранимые объекты только BaseElement и его производными и указываем, что T - ссылочный тип
{
  void foo() { T t = new T(); t.MethodFromBaseElementClass(); }
}
 


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


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



Влезу  smile 
Цитата(arilou @  28.6.2006,  15:35 Найти цитируемый пост)
Хоббит, можно еще через generics сделать:

Цитата(Хоббит @  28.6.2006,  13:11 Найти цитируемый пост)
 методы индексаторы и.т.д. класса GroupCollection возвращали и приниамли элемент Group

Зачем использовать дженерики, если класс изначально использует только один тип
Цитата(Хоббит @  28.6.2006,  13:11 Найти цитируемый пост)
 Group

 smile  smile  
PM MAIL WWW ICQ   Вверх
arilou
Дата 28.6.2006, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(ivashkanet @  28.6.2006,  17:03 Найти цитируемый пост)
Зачем использовать дженерики, если класс изначально использует только один тип

Предпологаается, что будут еще и 

UserCollection : BaseElementCollection<User>, TchortCollection : BaseElementCollection<Tchort>, и т.п smile 


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

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



таких 9 классов .... smile ... вот
Только что то уже и не понадобилось это все... 
обощлись без них ... создали хороший базовый класс и пронаследовали от него всего, немного доопределили.. и все 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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