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

时间:2009-03-08 16:30:38

标签: c# inheritance interface

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

interface IUser
{
    string UserName
    {
        get;
    }
}

我想要这样的事情:

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

我需要继承权。我无法将IUser的正文复制到IMutableUser并添加设置的访问者。

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

3 个答案:

答案 0 :(得分:14)

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

public interface IMutableUser : IUser
{
    new string Username { get; set; }
}

另一种方法是添加显式的set方法;例如:

public interface IMutableUser : IUser
{
    void SetUsername(string value);
}

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

答案 1 :(得分:9)

您可以使用抽象类:

interface IUser
{
    string UserName
    {
        get;
    }
}

abstract class MutableUser : IUser
{
    public virtual string UserName
    {
        get;
        set;
    }
}

另一种可能性是:

interface IUser
{
    string UserName
    {
        get;
    }
}

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

class User : IUser, IMutableUser
{
    public string UserName { get; set; }
}

答案 2 :(得分:8)

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

public class MyUser : IUser
{

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

    public MyProperty { get; set; }

}

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