我的失败谈: 隐藏Interface的成员
蛮有心情看了看OracleClient命名空间。当看到OracleConnection类的时候,突然发觉少了点儿什么,是的,OracleConnection中没有ConnectionTimeout属性。
怎么可能?这个属性应该是IDbConnection的,OracleConnection继承了IDbConnection,就应该实现IDbConnection.ConnectionTimeout。自己明明记得一次想要隐藏一个成员的时候,企图把Public改成Private,结果被编译器训了一通。。。
于是知道了有可以隐藏的方法,但是就是不知道怎么实现的。
最开始重复做了一次。
# 完成了IDbConnection其他成员的实现,这里只列出关键代码。
{
public int ConnectionTimeout
{
get
{
throw new NotImplementedException();
}
}
}
改成
{
private int ConnectionTimeout
{
get
{
throw new NotImplementedException();
}
}
}
理所当然的失败。
最后是通过察看Mono中对OracleConnection.ConnectionTimeout的实现。
[MonoTODO]
get { return -1; }
}
这下才明白需要这样写才可以隐藏。
int IDbConnection.ConnectionTimeout
一直都以为 [ 接口名 . 接口成员名 ] 的写法只是为了解决继承不同接口中有相同成员名冲突时采用的。没有想到......
看来对我这样只是走马观花的看看书不写代码的人是无法理解很深的。
# 这样的方法只是隐藏了OracleConnection中的ConnectionTimeout。当用IDbConnection访问的时候,还是可以使用的。我会比较强硬的throw new NotImplementedException();不知道是不是真的和Mono一样,返回一个-1比较好。不过.net framework文档上写的是哪怕通过ConnectionString设置Timeout也不会有效果,每次都返回0。。。 [throw一个NotImplementedException无疑是错的。至少只能在Debug版抛出异常。否则在被其他程序通过接口调用时,无法通用的制作代码。2004/07/02]