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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> полиморфизм и типы 
:(
    Опции темы
cthutq
Дата 17.9.2006, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



есть базовый класс Base. От него унаследованы 2 класса A и B.

Есть список объектов А и список В.
Я могу вабрать из любого списка любой объект и храню на него указатель.

[CODE=C#]
private Base base;
ArrayList listA;
ArrayList listB;

// выбираем любой элемент
base = listX[i];
[/CODE]

1. Как проверить что за объект base (А или В)
2. что будет с указателем, если этот элемент удален из списка. Будет ли равен ли он null, и если нет - как проверить его валидность ?
PM MAIL   Вверх
reloni
Дата 17.9.2006, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(cthutq @  17.9.2006,  13:20 Найти цитируемый пост)
1. Как проверить что за объект base (А или В)

Так можно узнать название базового класса:
Код

Console.WriteLine(Base.GetType().BaseType.Name.ToString());

Цитата(cthutq @  17.9.2006,  13:20 Найти цитируемый пост)
2. что будет с указателем, если этот элемент удален из списка. Будет ли равен ли он null, и если нет - как проверить его валидность ? 

Нулевую ссылку можно проверить так:
Код

if(Base == null)
// делать что-то

Но если ты сделал так:
Цитата(cthutq @  17.9.2006,  13:20 Найти цитируемый пост)
base = listX[i];

И потом удалил из списка этот элемент, то из списка он ессно пропадет, а вот Base будет попрежнему указывать на этот класс.

PM MAIL ICQ   Вверх
cthutq
Дата 17.9.2006, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



3. Если Base это структура, с фиксированными полями
Код

    unsafe public struct Base
    {
        public ulong index;
        public fixed byte data[6];
        public uint value;
    };


и А и В тоже структуры, то почему не получается унаследоваться
Код

error CS0527: Type 'Base' in interface list is not an interface


Добавлено @ 12:38 
Цитата(reloni @  17.9.2006,  12:35 Найти цитируемый пост)
И потом удалил из списка этот элемент, то из списка он ессно пропадет, а вот Base будет попрежнему указывать на этот класс.

так вот как именно проверить вылидность - или только try/catch

Это сообщение отредактировал(а) cthutq - 17.9.2006, 12:38
PM MAIL   Вверх
reloni
Дата 17.9.2006, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Структуры не могут наследоваться друг от друга. Только реализовывать интерфейсы.
Цитата(cthutq @  17.9.2006,  13:36 Найти цитируемый пост)
так вот как именно проверить вылидность - или только try/catch

Не понимаю. Проверять, присутствует ли ссылка на твой класс в коллекции? Тогда самый простой вариант пробегать все элементы циклом и сравнивать ссылки, если что-то найдешь, значит она там есть, если нет, значит нетsmile
PM MAIL ICQ   Вверх
cthutq
Дата 17.9.2006, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(reloni @  17.9.2006,  12:35 Найти цитируемый пост)
Так можно узнать название базового класса:

не - мне нужно именно порожденный класс (dynamic_cast)- может это Name ?


Цитата(reloni @  17.9.2006,  12:56 Найти цитируемый пост)
Не понимаю. Проверять, присутствует ли ссылка на твой класс в коллекции? Тогда самый простой вариант пробегать все элементы циклом и сравнивать ссылки, если что-то найдешь, значит она там есть, если нет, значит нет

а может проще сразу узнать валидность -  бегать слишком накладно
PM MAIL   Вверх
reloni
Дата 17.9.2006, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(cthutq @  17.9.2006,  14:07 Найти цитируемый пост)
не - мне нужно именно порожденный класс (dynamic_cast)- может это Name ?

Ну тогда так:
Код

Console.WriteLine(Base.GetType().Name.ToString());

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


Шустрый
*


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

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



reloni, спасибо


Цитата(reloni @  17.9.2006,  12:56 Найти цитируемый пост)
Структуры не могут наследоваться друг от друга. Только реализовывать интерфейсы

но если я определяю их как классы, то говорит, что фиксированные поля могут пыть только у структуры

короче палка о двух концах smile

Добавлено @ 13:38 
и еще - если указатель не типа Base, а типа Object - как тогда проверить каково он типа ?
PM MAIL   Вверх
reloni
Дата 17.9.2006, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(cthutq @  17.9.2006,  14:29 Найти цитируемый пост)
и еще - если указатель не типа Base, а типа Object - как тогда проверить каково он типа ? 

Хм, я имел ввиду, что Base это переменная, не важно какого типа. 
Код

Object obj= new Object();
Console.WriteLine(obj.GetType().Name.ToString());

MyClass cl1 = new MyClass();
Console.WriteLine(cl1.GetType().Name.ToString());

Результатом будет вывод на экран имени класса, Object и MyClass соответственно.
PM MAIL ICQ   Вверх
cthutq
Дата 17.9.2006, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



большое спасибо - с этим разобрался

Остался последний вопрос - как инициализировать базовый класс в конструкторе наследника ?
PM MAIL   Вверх
Void
Дата 17.9.2006, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Цитата(cthutq @  17.9.2006,  17:29 Найти цитируемый пост)
как инициализировать базовый класс в конструкторе наследника

Код
class A
{
    public A(/* some args*/) { }
}

class B : A
{
    public B(/* some other args */) : base(/* ... */) { }
}


Это сообщение отредактировал(а) Void - 17.9.2006, 16:29


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
reloni
Дата 17.9.2006, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(cthutq @  17.9.2006,  16:29 Найти цитируемый пост)
Остался последний вопрос - как инициализировать базовый класс в конструкторе наследника ? 

Опять непонятноsmile
Когда вызывается конструктор класса наследника, то перед этим вызывается конструктор класса родителя. 
Т.е. если у тебя есть класс BaseClass и NewClass - его наследник, то конструктор по умолчанию для наследника выглядит так:
Код

public NewClass()
{
// ....
}

Что эквивалентно:
Код

public NewClass() : base()
{
// ....
}

base() - означает вызов соотв. конструктора базового класса. Можно делать так:
Код

public NewClass(int param) : base(param)
{
// ....
}

Но тогда в базовом классе должен присутствовать соответствующий конструктор.
Короче, при инициализации любого класса, вызываются поочередно конструкторы всех классов, от которых он унаследован.
Советую купить эту книжку, там все подробно расписано по этому поводу.
PM MAIL ICQ   Вверх
cthutq
Дата 17.9.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



reloni, спасибо огромное

извини - но еще вопрос.

т.к. есть указатель на элемент списка (А или В), а списки постоянно обновляются, то после обновления (сначала чиститься а потом заполняется) сам указатель указывает не на новый элемент списка, а на старый, который еще висит в памяти и его не убил сборщик мусора.

Как добиться чтоб он был чисто указателем. Тоесть если умрет объект в списке, то и умер объект на который указывает указатель.
PM MAIL   Вверх
Void
Дата 17.9.2006, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



cthutq, см. класс System.WeakReference.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
cthutq
Дата 17.9.2006, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Void, то что нужно smile

только не нашел есть ли у него operator =
чтоб можно было бы их копировать
PM MAIL   Вверх
Void
Дата 17.9.2006, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Код
WeakReference r1;
...
WeakReference r2 = new WeakReference(r1.Target);

?


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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