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

Поиск:

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


Шустрый
*


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

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



Привет всем!!!
Есть такая проблемка
Есть такой класс
Код

class clientClass:TcpClient
   {
        string nameClient;
        bool stateConnect;
 public clientClass(string hostname, int port, string nameClient)
            : base(hostname, port)
        {
            this.nameClient = nameClient;
        }
}

как выполнить такое преобразование
Код

clientClass tcp = (clientClass)listener.EndAcceptTcpClient(ar);// Здесь ошибка

PM MAIL   Вверх
Ceiceron
Дата 29.1.2010, 09:42 (ссылка) |  (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я так понимаю listener.EndAcceptTcpClient(ar) возвращает TcpClient, тогда преобразовать базовый класс к наследнику не получиться. Возможно только обратное. Так что тут может помочь создание наследника по базовому классу. Например добавить еще один конструктор в наследника, который будет создавать объект наследника на основе базового класса.
Код

clientClass tcp =new clientClass(listener.EndAcceptTcpClient(ar));

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


Эксперт
***


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

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



Цитата(Ceiceron @  29.1.2010,  08:42 Найти цитируемый пост)
Так что тут может помочь создание наследника по базовому классу

Ceiceron, но ведь здесь вместо наследования применяется композиция? Как созданный таким образом объект tcp получит доступ к защищенным членам объекта TcpClient?
Т.е. имеем декоратор, с делегированием всех вызовов внутреннему объекту TcpClient... 

Не знаю, это ли - то нужно автору.

Код

clientClass tcp = listener.EndAcceptTcpClient(ar) as clientClass;
if (tcp != null)
{
// делаем то, что хотели
}





--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Ceiceron
Дата 29.1.2010, 13:25 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

clientClass tcp = listener.EndAcceptTcpClient(ar) as clientClass;
if (tcp != null)
{
// делаем то, что хотели
}



в том-то и дело, что tcp всегда будет null, особенно если использовать as.

Цитата(tol05 @ 29.1.2010,  12:29)

Ceiceron, но ведь здесь вместо наследования применяется композиция? Как созданный таким образом объект tcp получит доступ к защищенным членам объекта TcpClient?
Т.е. имеем декоратор, с делегированием всех вызовов внутреннему объекту TcpClient... 


clientClass является наследником TcpClient, он так и так будет иметь доступ к защищенным членам класса.
в любом случае для инициализации clientClass потребуются только публичные свойства TcpClient.

PM MAIL   Вверх
tol05
Дата 29.1.2010, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Ceiceron @  29.1.2010,  12:25 Найти цитируемый пост)
clientClass является наследником TcpClient, он так и так будет иметь доступ к защищенным членам класса.

создайте базовый класс и его наследник. Создайте protected поле в базовом классе
Передайте объект базового класса в конструктор наследника и так попытайтесь обратиться к защищенному полю.
Код

class A
  {
    protected int i;
  }

  class B : A
  {
    public B(A a)
    {
      i = a.i;
    }
  }

как? возможно такое?
Цитата(Ceiceron @  29.1.2010,  12:25 Найти цитируемый пост)
в любом случае для инициализации clientClass потребуются только публичные свойства TcpClient.

какой смысл в наследовании тогда? В чем его польза?

Это сообщение отредактировал(а) tol05 - 29.1.2010, 16:17


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Ceiceron
Дата 30.1.2010, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Понятное дело, что таким образом не получиться получить доступ к protected полям. 
Но суть вопроса в том как получить от базового объекта экземпляр объекта-наследника. Простым приведением не получиться, соответственно нужно создавать наследник либо по базовому классу, как совершенно новый объект, либо использовать базовый тип по другому, например как поле класса обертки. Ваш вариант в as не прокатит. Предложите вариант решения вопроса.
PM MAIL   Вверх
tol05
Дата 31.1.2010, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Ceiceron, я согласен с Вами.

Единственный вариант - хранить в clientClass ссылку на TcpClient и делегировать все функции ему. 
Получим wrapper объекта TcpClient с некоторыми дополнительными сервисами, но и с возможностями, которыми обладает любой обычный клиент, использующий объект TcpClient.


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

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


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

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


 




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


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

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