在C#中为接口属性添加'set'

str*_*ger 18 c# inheritance interface

我希望通过为该接口中的属性提供set访问器来"扩展"接口.界面看起来像这样:

interface IUser
{
    string UserName
    {
        get;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要这样的东西:

interface IMutableUser : IUser
{
    string UserName
    {
        get;
        set;
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要继承权.我不能复制的身体IUser进入IMutableUser并添加set访问.

这可能在C#中吗?如果是这样,怎么办呢?

Chr*_*fer 14

我没有看到你发布的内容不起作用的任何理由?刚做了一个快速测试,它编译好了,但是发出了关于隐藏的警告.这可以通过添加new关键字来修复,如下所示:

public interface IMutableUser : IUser
{
    new string Username { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是添加显式集合方法; 例如:

public interface IMutableUser : IUser
{
    void SetUsername(string value);
}
Run Code Online (Sandbox Code Playgroud)

当然,我更喜欢使用setter,但如果不可能,我想你会做你必须做的事情.


Dar*_*rov 9

你可以使用一个抽象类:

interface IUser
{
    string UserName
    {
        get;
    }
}

abstract class MutableUser : IUser
{
    public virtual string UserName
    {
        get;
        set;
    }
}
Run Code Online (Sandbox Code Playgroud)

另一种可能性是:

interface IUser
{
    string UserName
    {
        get;
    }
}

interface IMutableUser
{
    string UserName
    {
        get;
        set;
    }
}

class User : IUser, IMutableUser
{
    public string UserName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)


wom*_*omp 8

您可以通过显式实现接口来"覆盖"接口中的属性.克里斯的答案可能就是你所概述的场景所需要的所有内容,但考虑一个稍微复杂的场景,你需要在你的类上使用getter/setter,但界面只定义了getter.您可以通过执行以下操作来解决此问题:

public class MyUser : IUser
{

    IUser.MyProperty { get { return "something"; } }

    public MyProperty { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

通过明确实施IUser.MyProperty,您满足合同.但是,通过提供public MyProperty,对象的API将永远不会显示显式接口版本,并且将始终将MyProperty与get/set一起使用.