2013-06-08 4 views
0

Я пытаюсь подклассифицировать объект Connection для создания AuthenticatedConnection, который должен функционировать таким же образом, как и Connection, с добавлением токена. Прямым решением является передача «wrap» соединения с конструктором подкласса.Копирование защищенного поля в конструкторе подкласса

Это решение кажется сломанным, поскольку я не могу получить доступ к защищенному элементу параметра. Это означает, что базовый конструктор не может быть вызван. Есть ли способ реализовать конструкторы, чтобы можно было обернуть конструкторы так? Например: new AuthenticatedConnection("token", existingConnection)

Это текущая (прерванная) реализация. Ошибка компиляции является: Cannot access protected member 'Connection._client' via a qualifier of type 'Connection'; the qualifier must be of type 'AuthenticatedConnection' (or derived from it)

class Connection 
{ 
    // internal details of the connection; should not be public. 
    protected object _client; 

    // base class constructor 
    public Connection(object client) { _client = client; } 
} 

class AuthenticatedConnection : Connection 
{ 
    // broken constructor? 
    public AuthenticatedConnection(string token, Connection connection) 
     : base(connection._client) 
    { 
     // use token etc 
    } 
} 
+0

Разве вы не можете просто установить его в конструктор? –

+0

Шаблон Decorator может удовлетворить ваши потребности (http://www.codeproject.com/Articles/479635/UnderstandingplusandplusImplementingplusDecoratorp). По сути, вам нужен объект, который * имеет * a 'Connection' и * is * a 'Connection'. Это выполнимо, но вам придется «переслать» все методы, необходимые для правильного функционирования производного экземпляра, и это может стать беспорядочным. –

ответ

5

Самым простым решением было бы создать «копирование конструктор» для базового класса:

class Connection 
{ 
    // internal details of the connection; should not be public. 
    protected object _client; 

    // base class constructor 
    public Connection(object client) { _client = client; } 

    // copying constructor 
    public Connection(Connection other) : this(other._client) { } 
} 

class AuthenticatedConnection : Connection 
{ 
    // broken constructor? 
    public AuthenticatedConnection(string token, Connection connection) 
     : base(connection) 
    { 
     // use token etc 
    } 
} 
+0

Предлагаемое изменение: Да, популярным термином представляется [«конструктор копирования»] (http://en.wikipedia.org/wiki/Copy_constructor). В статье [как реализовать ее в C#] есть статья MSDN (http://msdn.microsoft.com/en-us/library/ms173116 (v = vs.110) .aspx). – Douglas

+0

d'oh! Да, конструктор копирования именно то, что я пытался реализовать, я просто не думал помещать его в базовый класс вместо подкласса. Я сохранил конструктор копирования как «защищенный», но все работает так, как должно. – guhou

0

Простым решением является передача «обертку» соединение с конструктором подкласса

Это непросто, ИМО. Просто так:

class AuthenticatedConnection : Connection 
{ 
    public AuthenticatedConnection1(string token, object client) 
     : base(client) 
    { 
     // use token etc 
    } 
} 

Но если вы хотите, чтобы обернуть реальное соединение, я бы это так:

interface IConnection {} 
class Connection : IConnection 
{ 
    // internal details of the connection; should not be public. 
    protected object _client; 

    // base class constructor 
    public Connection(object client) { _client = client; } 
} 

class AuthenticatedConnection : IConnection 
{ 
    private readonly IConnection connection; 

    public AuthenticatedConnection2(string token, IConnection connection) 
    { 
     // use token etc 
    } 
} 
Смежные вопросы