Добавьте 'set' в свойства интерфейса в С#
Я ищу "расширение" интерфейса, предоставляя набор доступа к свойствам в этом интерфейсе. Интерфейс выглядит примерно так:
interface IUser
{
string UserName
{
get;
}
}
Мне нужно что-то вроде этого:
interface IMutableUser : IUser
{
string UserName
{
get;
set;
}
}
Мне нужно наследование. Я не могу скопировать тело IUser
в IMutableUser
и добавить аксессоры набора.
Возможно ли это в С#? Если да, то как это можно сделать?
Ответы
Ответ 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.