Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Преобразование к базовому классу


Автор: radow 29.1.2010, 01:59
Привет всем!!!
Есть такая проблемка
Есть такой класс
Код

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);// Здесь ошибка

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

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

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

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

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

Код

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



Автор: Ceiceron 29.1.2010, 13:25
Код

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.

Автор: tol05 29.1.2010, 16:06
Цитата(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.

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

Автор: Ceiceron 30.1.2010, 19:39
Понятное дело, что таким образом не получиться получить доступ к protected полям. 
Но суть вопроса в том как получить от базового объекта экземпляр объекта-наследника. Простым приведением не получиться, соответственно нужно создавать наследник либо по базовому классу, как совершенно новый объект, либо использовать базовый тип по другому, например как поле класса обертки. Ваш вариант в as не прокатит. Предложите вариант решения вопроса.

Автор: tol05 31.1.2010, 00:17
Ceiceron, я согласен с Вами.

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)