Подтвердить что ты не робот

Добавьте 'set' в свойства интерфейса в С#

Я ищу "расширение" интерфейса, предоставляя набор доступа к свойствам в этом интерфейсе. Интерфейс выглядит примерно так:

interface IUser
{
    string UserName
    {
        get;
    }
}

Мне нужно что-то вроде этого:

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

Мне нужно наследование. Я не могу скопировать тело IUser в IMutableUser и добавить аксессоры набора.

Возможно ли это в С#? Если да, то как это можно сделать?

4b9b3361

Ответ 1

Я не вижу причин, почему то, что вы опубликовали, не должно работать? Просто сделал быстрый тест, и он компилируется в порядке, но дает предупреждение о сокрытии. Это можно исправить, добавив новое ключевое слово, например:

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

Альтернативой может быть добавление явных методов набора; например:

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

Конечно, я бы предпочел использовать сеттеры, но если это не возможно, я думаю, вы делаете то, что должны.

Ответ 2

Вы можете использовать абстрактный класс:

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; }
}

Ответ 3

Вы можете "переопределять" свойства в интерфейсе, явно реализуя интерфейсы. Ответ Криса, вероятно, все, что вам понадобится для сценария, который вы наметили, но рассмотрите несколько более сложный сценарий, в котором вам нужен геттер/сеттер на вашем классе, но интерфейс определяет только получателя. Вы можете обойти это, выполнив следующие действия:

public class MyUser : IUser
{

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

    public MyProperty { get; set; }

}

Явным образом реализуя IUser.MyProperty, вы выполняете контракт. Однако, предоставляя общедоступный MyProperty, API для вашего объекта никогда не будет показывать явную версию интерфейса и всегда будет использовать MyProperty с помощью get/set.