0

Connectionオブジェクトをサブクラス化して、トークンを追加しAuthenticatedConnectionて と同じように機能するを作成しようとしています。Connection簡単な解決策は、サブクラス コンストラクターとの接続を「ラップ」して渡すことです。

パラメータの保護されたメンバーにアクセスできないため、このソリューションは壊れているようです。これは、基本コンストラクターを呼び出すことができないことを意味します。コンストラクターをそのようにラップできるようにコンストラクターを実装する方法はありますか? 例えば: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
    }
}
4

2 に答える 2

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
    }
}
于 2013-06-08T10:56:03.590 に答える
0

簡単な解決策は、サブクラス コンストラクターとの接続を「ラップ」して渡すことです。

これは簡単ではありません、IMO。簡単なのは次のとおりです。

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
    }
}
于 2013-06-08T11:16:57.880 に答える