C#中如何将子类属性传递给抽象类
解决方案:让抽象类B访问子类A的属性
要实现子类A定义属性、抽象类B可以使用的效果,核心是在抽象类B中定义抽象/虚成员,让子类A去实现或重写,这样B就能通过这些成员访问A的属性值。以下是两种可行的实现方式:
方式一:抽象属性(强制子类实现)
修改抽象类B,定义抽象属性,要求所有子类必须实现该属性:
public abstract class B { // 抽象属性,子类必须实现 public abstract string Action { get; } protected B() { // 构造函数中使用子类实现的属性 string a = Action; } public virtual void Test(string _action) { // 方法中使用子类的属性值 _action = Action; } }
子类A实现这个抽象属性:
public class A : B { // 实现抽象属性,返回A自定义的值 public override string Action => "A专属的Action值"; // 也可以用带字段的形式,支持修改 // private string _action = "A专属的Action值"; // public override string Action // { // get => _action; // set => _action = value; // } }
方式二:虚属性(子类可选重写)
如果不需要强制所有子类都实现,可在B中定义带默认值的虚属性,子类A按需重写:
public abstract class B { // 虚属性,提供默认值 public virtual string Action => string.Empty; protected B() { string a = Action; } public virtual void Test(string _action) { _action = Action; } }
子类A重写虚属性:
public class A : B { // 重写虚属性,替换为A自定义的值 public override string Action => "A自定义的Action"; }
注意事项
- 在抽象类构造函数中访问子类属性时,确保子类的属性初始化逻辑已经完成(比如使用表达式体属性或在子类构造函数中先初始化字段),避免出现未初始化的问题。
- 若属性需要被修改,可使用带get/set的属性形式,而非只读的表达式体。
内容的提问来源于stack exchange,提问作者Rade Vignjevic
相关产品推荐
相关产品推荐

