Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Наследование и типы в с#

41K
11 января 2012 года
rikki
46 / / 27.05.2010
В общем вопрос к знатокам c#. Допустим есть 2 типа:
ParentType и ChildType.
ParentType - встроенный тип c#, имеет поля:
-field_1
-field_2
........
-field_n
ChildType наследуется от ParentType, и в него нужно добавить только одно поле:
-child_field
Возникает вопрос при попытке конвертировать ParentType в ChildType:
 
Код:
ParentType obj2 = new ParentType();
ChildType obj1 = obj2 as ParentType;

Ошибки не возникает, но поля, которые наследуются в obj1 остаются пустыми.
Понимаю, можно сделать метод в классе ChildType:
 
Код:
public ChildType toChildType(ParentType obj)
{
// переприсвоить поля
return ConvertedObj;
}

но есть ли решение поэлегантнее ? быть может есть интерфейсы которые подразумевают подобные преобразования ?
Заранне спасибо!
З.Ы. Переприсвоить поля не получиться, так как некоторые поля родительского класса только для чтения, соответственно компилятор ругается при попытке присвоения полю которое унаследовалось какого либо значения.
277
11 января 2012 года
arrjj
1.7K / / 26.01.2011
К сожалению в c# нельзя перегружать оператор присваивания
Operator overloading
Цитата:

Note that the assignment operator itself (=) cannot be overloaded.



Как выход создать конструктор в ChildType , принимающий параметром ParentType. ([COLOR="silver"]В с++ после этого не было необходимости перегружать оператор =, хз как в c# [/COLOR])
И либо ChildType obj1 = obj2; должна сработать либо ChildType obj1 = new ChildType(obj2);

41K
11 января 2012 года
rikki
46 / / 27.05.2010
Можно ещё использовать перегрузку операторов преобразования - implicit explicit (явного и не явного), но родительский тип запрещает и это (
решение должно быть тривиальное, просто мозги просто отказываются работать...
может через base как-то добраться можно до родительских свойств ?
41K
11 января 2012 года
rikki
46 / / 27.05.2010
Пока выкручусь так:
1 сохранить ссылку в приватном поле на родительский класс (через конструктор).
2 переопределить все свойства в ChildType и на get возвращать поля скрытой ссылки.
Правда это уже никакое не наследование, но пока сойдет.
277
11 января 2012 года
arrjj
1.7K / / 26.01.2011
Ты не просто изобрел велосипед - ты изобрел велосипед с квадратными колёсами.
41K
11 января 2012 года
rikki
46 / / 27.05.2010
Цитата:
ChildType obj1 = new ChildType(obj2);


Сделал по твоим же советам) наследование естессно отпало

277
11 января 2012 года
arrjj
1.7K / / 26.01.2011
Оставь наследование, просто в конструктор перегрузи
[code=c#]
class ChildType : ParentType
{
public ChildType():base()
{
//свои какието вычисления, заполнение недостающих полей.
}
public ChildType(ParentType obj):base(obj)
{
//свои какието вычисления, заполнение недостающих полей.
}
}
[/code]
41K
11 января 2012 года
rikki
46 / / 27.05.2010
То что нужно! Спасибо тебе, добрый человек =)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог