我正在尝试子类化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 :(得分: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
}
}
答案 1 :(得分:0)
一个简单的解决方案是使用子类构造函数
传递'wrap'连接
这不是直截了当的,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
}
}