继承DbParameter时,能否同时重写并隐藏属性且相互实现?
解决方案
你遇到的核心问题是C#不允许同一类中定义同名成员(哪怕返回类型不同),直接声明两个Precision属性会触发编译错误。要同时保留short类型属性以兼容原有代码,并重写基类byte类型属性,可通过以下方式实现:
实现代码
public class MyDbParameter : DbParameter { // 保留原有对外的short类型Precision属性,供旧代码调用 public new short Precision { get; set; } // 显式实现IDbDataParameter接口的Precision属性(byte类型) byte IDbDataParameter.Precision { get => (byte)Precision; set => Precision = value; } // 重写基类DbParameter的Precision属性,委托给接口实现 public override byte Precision { get => ((IDbDataParameter)this).Precision; set => ((IDbDataParameter)this).Precision = value; } }
代码说明
public new short Precision:保留原有对外的short类型属性,new关键字用于明确隐藏基类的byte类型Precision,确保旧代码调用子类实例的Precision时,获取的是short类型值,无破坏性变更。- 显式接口实现
IDbDataParameter.Precision:由于DbParameter实现了IDbDataParameter接口,显式实现该接口的Precision属性可避免与子类的short属性重名,同时完成short到byte的类型转换。 public override byte Precision:重写基类的byte类型属性,通过将子类实例转换为IDbDataParameter接口来调用显式实现的逻辑,确保通过基类引用访问Precision时,能获取到基于子类short属性转换而来的byte值。
关键注意点
- 无需担心递归调用问题:显式接口实现的
Precision与子类的short属性是两个独立成员,转换为接口调用时会明确指向接口实现逻辑,避免循环调用。 - 按你所说的,暂不处理溢出问题,直接强制类型转换即可,因为实际值可容纳在
byte范围内。
内容的提问来源于stack exchange,提问作者Bwmat
相关产品推荐
相关产品推荐

