我想要实现这样的事情:
interface IAbstract
{
string A { get; }
object B { get; }
}
interface IAbstract<T> : IAbstract
{
T B { get; }
}
class RealThing<T> : IAbstract<T>
{
public string A { get; private set; }
public T B { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
所以我可以这样做:
RealThing<string> rt = new RealThing<string>();
IAbstract ia = rt;
IAbstract<string> ias = rt;
object o = ia.B;
string s = ias.B;
Run Code Online (Sandbox Code Playgroud)
这可能吗?
Jon*_*eet 10
非常接近.三件事:
您应该使用newin IAbstract<T>表示您知道您正在隐藏现有成员:
new T B { get; }
Run Code Online (Sandbox Code Playgroud)
但即便没有,你仍然只会收到警告.
您需要实现IAbstract.B内部RealThing,您几乎肯定会使用显式接口实现,委托给强类型成员:
object IAbstract.B { get { return B; } }
Run Code Online (Sandbox Code Playgroud)在测试代码中,您需要为以下内容指定类型参数RealThing:
RealThing<string> rt = new RealThing<string>();
Run Code Online (Sandbox Code Playgroud)这很好,甚至是一种相当常见的模式,适合您希望能够获得非泛型形式的接口.
是的,几乎没有变化
interface IAbstract
{
string A { get; }
object B { get; }
}
interface IAbstract<T> : IAbstract
{
new T B { get; }
}
sealed class RealThing<T> : IAbstract<T>
{
public string A { get; private set; }
public T B { get; private set; }
object IAbstract.B
{
get { return B; }
}
}
Run Code Online (Sandbox Code Playgroud)
所以你可以写
var rt = new RealThing<string>();
IAbstract ia = rt;
IAbstract<string> ias = rt;
object o = ia.B;
string s = ias.B;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
484 次 |
| 最近记录: |