C#. Где может быть полезна явная реализация интерфейса?

прочел как это делать, но не понял где и зачем использовать
  • Вопрос задан
  • 659 просмотров
Пригласить эксперта
Ответы на вопрос 4
@JuniorNoobie
Сижу в поддержке, пишу мелкие проекты
Ну есть у вас, предположим, два интерфейса (IDollar и IEuro) в которых описан метод с одним и тем же именем (getPrice). Если у вас случится так, что будет класс (Car), который будет реализовывать эти интерфейсы, то для корректной работы, а именно, чтобы возвращать цену в долларах и евро, необходимо явно реализовать оба метода интерфейсов в классе и вызывать так:

(IEuro)car.getPrice() - цена в евро
(IDollar)car.getPrice() - цена в долларах
Ответ написан
@Sing303
Тут кратко описывается, зачем нужны интерфейсы
sergeyteplyakov.blogspot.ru/2014/12/what-are-inter...
Ответ написан
Комментировать
lexxpavlov
@lexxpavlov
Программист, преподаватель
Я иногда делаю в классе и обычный метод, и явно реализуемый, с тем же именем, для удобства.
Например, иногда нужен компарер как объект с методом, а иногда объект не нужен, и тогда можно вызывать статический метод.
public class NaturalComparer : IComparer<string>
{
	[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
	private static extern int StrCmpLogicalW(string psz1, string psz2);

	public static int Compare(string x, string y)
	{
		return StrCmpLogicalW(x, y);
	}

	int IComparer<string>.Compare(string x, string y)
	{
		return StrCmpLogicalW(x, y);
	}
}

public class TestApp
{
	public static void Main()
	{
		// Используем явную реализацию
		var arr = new [] { "a5", "a1", "a10", "a3", "a7" };
		Array.Sort(arr); // a1, a10, a3, a5, a7
		Array.Sort(arr, new NaturalComparer()); // a1, a3, a5, a7, a10

		// Используем статический метод
		var list = new List<string> { "a5", "a1", "a10", "a3", "a7" };
		const string max = "a4";
		var minElements1 = list.Where(s => s.CompareTo(max) < 0).ToList(); // a1, a10, a3
		var minElements2 = list.Where(s => NaturalComparer.Compare(s, max) < 0).ToList(); // a1, a3
	}
}
Ответ написан
Комментировать
Valeriy1991
@Valeriy1991
Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
Добрый день! Интерфейсы (как и абстрактные классы) позволяют (с точки зрения архитектуры) Вам разрабатывать слабо связанные приложения. Это, в свою очередь, приводит к тому, что: 1) внести изменения в код становится проще; 2) приложение не зависит от конкретных реализаций, а зависит от абстракций.
Ответ написан
Ваш ответ на вопрос

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

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