You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在接口实现类中访问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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 15:13:24