如何在接口实现类中访问interface的default property设置值?
接口默认属性实现中访问设置值的解决方案
问题场景
你定义了包含默认属性的接口IMyInterface,代码如下:
public interface IMyInterface { string DoSomething(); MySpecialClass ClassData {get => new ClassData(); set{} } }
原本想通过接口默认实现减少重复代码,但部分实现类(比如SomeClass)需要在内部方法里访问外部设置的ClassData值,示例代码如下:
SomeClass s = new SomeClass(); s.ClassData = "some data I want to use later maybe..."; public class SomeClass: IMyInterface { public string DoSomething() { // 此处希望访问接口的ClassData字段进行操作 } }
但目前在实现类内部,哪怕用this也无法访问已设置的默认属性值,需要解决这个问题。
解决方案
方法一:使用接口私有字段(C# 8.0+)
C# 8及以上版本允许接口定义私有成员,我们可以用私有字段来存储ClassData的值,修正默认属性的实现:
public interface IMyInterface { // 私有字段存储属性值 private MySpecialClass _classData; string DoSomething(); MySpecialClass ClassData { get => _classData ?? new MySpecialClass(); set => _classData = value; } }
之后实现类无需自己实现ClassData,直接通过this.ClassData就能访问外部设置的值:
public class SomeClass: IMyInterface { public string DoSomething() { var data = this.ClassData; // 对data进行操作 return data.ToString(); } }
方法二:用抽象基类替代接口默认实现
如果项目使用的是C# 8以下版本,不支持接口私有字段,可以改用抽象基类来封装默认逻辑:
public abstract class MyBaseClass { protected MySpecialClass _classData; public abstract string DoSomething(); public virtual MySpecialClass ClassData { get => _classData ?? new MySpecialClass(); set => _classData = value; } }
实现类继承该基类即可:
public class SomeClass: MyBaseClass { public override string DoSomething() { var data = this.ClassData; // 处理逻辑 return "操作完成"; } }
关键说明
- 接口私有字段是C# 8.0的新特性,使用前确认项目语言版本符合要求
- 抽象基类方案要注意类的单继承限制,而接口支持多实现,根据项目实际场景选择合适方案
内容的提问来源于stack exchange,提问作者LonelySemiColon
相关产品推荐
相关产品推荐

