如何在C#中重命名派生类/接口实现类的继承成员?
在C#中重命名继承/实现的成员
一、实现接口时自定义成员名称
C#没有VB那种直接指定接口成员实现名称的语法,但可以通过显式接口实现+封装公共成员的方式达成相同效果:
对应VB中重命名接口方法的场景,C#代码示例如下:
public interface IDemo { void DoSomething(); } public class ImplementIDemo : IDemo { // 显式实现接口成员,仅能通过接口类型访问 void IDemo.DoSomething() { // 这里写方法逻辑 } // 自定义名称的公共方法,内部调用显式实现的接口逻辑 public void AnotherSomething() { ((IDemo)this).DoSomething(); } } // 使用示例 IDemo varAsInterface = new ImplementIDemo(); varAsInterface.DoSomething(); // 通过接口实例调用原方法 ImplementIDemo varAsClass = new ImplementIDemo(); varAsClass.AnotherSomething(); // 通过类实例调用自定义名称的方法
显式接口实现的成员默认私有,只能通过接口实例访问;自定义的公共成员则可直接通过类实例调用,完全匹配VB中Implements指定成员名称的效果。
二、继承抽象类时重命名属性
针对抽象类的抽象属性,C#无法直接重命名替代实现,但可以通过重写基类成员+封装自定义属性的方式实现类似需求:
假设基类定义为:
public abstract class Base<T> { public abstract T Children { get; set; } }
派生类要将Children重命名为AnotherNameProp,可采用如下写法:
public class Derived<T> : Base<T> { // 重写基类抽象属性,设为保护级别仅内部使用 protected override T Children { get; set; } // 自定义名称的公共属性,封装基类的Children属性 public T AnotherNameProp { get => Children; set => Children = value; } }
如果想完全隐藏基类的Children属性,也可以用new关键字隐藏,但这种方式容易造成调用歧义,不推荐:
public class Derived<T> : Base<T> { private T _backingField; // 必须实现基类的抽象属性 public override T Children { get => _backingField; set => _backingField = value; } // 用new关键字隐藏基类属性,提供自定义名称 public new T AnotherNameProp { get => _backingField; set => _backingField = value; } }
内容的提问来源于stack exchange,提问作者Владимир Оношко
相关产品推荐
相关产品推荐

