pavelkarinin
@pavelkarinin
Full Stack Web Developer

Реализация интерфейса в c# — можно ли использовать другое имя для свойства/метода?

Что было ясно от куда такой вопрос: после продолжительного опыта работы на vb.net (как моего первого языка), относительно недавно у меня появилась необходимость, а главное - возможность осваивать с# (от версии 7.0) При этом, имея опыт работы с JavaScript, особых сложностей с освоением синтаксиса c# у меня не возникло. Безусловно, пока еще постоянно провожу аналогии с vb.net, поскольку мне часто не хватает очень многих его особенностей, поддержка которых отсутствует в с# априори. И вот, об одной такой особенности я хотел бы спросить у знатоков.

На vb.net определен такой интерфейс:
'''<summary>Определяет объект, являющийся элементом перечисления</summary>
'''<typeparam name="T">Тип идентификатора для элемента перечисления</typeparam>
Public Interface IEnum(Of T)

	'''<summary>Идентификатор элемента перечисления</summary>
	ReadOnly Property ID As T

	'и так далее...

End Interface

В реализации этого интерфейса, свойству ID я могу присвоить другое имя, которое по семантически более близко для данной конкретной реализации и выглядеть это будет так:
'''<summary>Отрасль промышленности</summary>
Public NotInheritable Class Industry : Implements IEnum(Of Byte)

	'''<summary>Код отраслевого направления</summary>
	Public ReadOnly Property Code As Byte Implements IEnum(Of Byte).ID

	'и так далее...

End Class

или так, уже в другой реализации:
'''<summary>Сфера деятельности</summary>
Public NotInheritable Class Employment : Implements IEnum(Of Integer)

	'''<summary>Тип сферы деятельности</summary>
	Public ReadOnly Property Type As Integer Implements IEnum(Of Integer).ID

	'и так далее...

End Class

Как, определив такой же интерфейс на c#, я могу в классах его реализующих использовать другое имя для свойства (в данном случае для свойства ID)?
  • Вопрос задан
  • 228 просмотров
Решения вопроса 2
freeExec
@freeExec
Участник OpenStreetMap
_
    public interface IId
    {
        int ID { get; set; }
    }

    public class Element : IId
    {
        public int Type
        {
            get
            {
                return ((IId)this).ID;
            }
        }

        int IId.ID { get; set; }
    }
Ответ написан
Идея заключается в том, чтобы явно определить свойство интерфейса, которое возвращает заданное свойство класса. В этом случае доступ к свойству интерфейса по его имени будет только из интерфейса. Из класса же будет доступ к его свойству.

/// <summary>Определяет объект, являющийся элементом перечисления</summary>
/// <typeparam name="T">Тип идентификатора для элемента перечисления</typeparam>
public interface IEnum<T>
{
  /// <summary>Идентификатор элемента перечисления</summary>
  T ID { get; }

  // и так далее...
}

/// <summary>Отрасль промышленности</summary>
public sealed class Industry : IEnum<byte>
{
  /// <summary>Код отраслевого направления</summary>
  public byte Code { get; private set;}
  byte IEnum<byte>.ID => Code; // явная реализация интерфейса

  // и так далее...
}

/// <summary>Сфера деятельности</summary>
public sealed class Employment : IEnum<int>
{
  /// <summary>Тип сферы деятельности</summary>
  public int Type { get; private set;}
  int IEnum<int>.ID => Type; // явная реализация интерфейса

  // и так далее...
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы