在实现接口的类中使用 Interface 的默认字段的值

Using the value of a default field of Interface inside the classes that implement the interface

提问人:LonelySemiColon 提问时间:7/20/2023 最后编辑:LonelySemiColon 更新时间:7/20/2023 访问量:34

问:

我有一个,我正试图在里面有一个。 所以我试了一下:interface default property

public interface IMyInterface
{
    string DoSomething();
    
    MySpecialClass ClassData {get => new ClassData(); set{} }
}

然后我有一堆实现这个,但是对于实现它的每个类来说,该字段没有什么特别之处,所以我不想在每个未来的类中继续复制粘贴它,这就是为什么我试图在界面中做它的默认实现。classes interface ClassData

但是,在某些具体类中,我可能希望实际使用该字段的值。所以我的问题是我该怎么做? 例如:

SomeClass s = new SomeClass();
s.ClassData = "some data I want to use later maybe...";

public class SomeClass: IMyInterface
{
    public string DoSomething()
    {
        // Here I want to have access to that field ClassData from the interface so I can do things to it.
    }   
}

我的**问题是,我无法访问该接口的实现,无法使用我刚刚在上面设置的默认属性值。我怎样才能实现这样的事情?

我也试过打电话给它,但没有运气。this

C#-10.0

评论

0赞 Klaus Gütter 7/20/2023
命名法:这不是一个“字段”,而是一个“属性”

答:

1赞 Aaron Robinson 7/20/2023 #1

若要在不重写该方法的类型上调用默认接口方法(或 here 属性),必须首先强制转换为接口类型:。((IMyInterface)this).ClassData

但是,如果重写该属性,则无法再访问该类上的默认实现。这就是为什么文档建议引入一个始终能够提供默认版本的版本,即使在默认版本被覆盖后也是如此:https://learn.microsoft.com/en-us/dotnet/csharp/advanced-topics/interface-implementation/default-interface-methods-versions#extend-the-default-implementationprotected static

请注意,DIM 并不是真正“打算”用于此类场景,而是真正旨在提供一种在不破坏与旧实现兼容性的情况下向接口添加方法的方法。建议要么为此使用抽象类,要么如果这不是一个选项,则在接口上使用静态方法。

评论

0赞 LonelySemiColon 7/20/2023
那么你是说我应该在该属性前面添加一个受保护的静态吗?我读了你的段落,但仍然不确定我应该做什么.