motkot
@motkot
Программирование C#.

Зачем нужны interface, если можно создавать функции?

Реальна какая разница?(подходит и к абстрактным классам)
Типо пишешь:
с интерфейсом:

class Dog : IAnimal
    {
        void IAnimal.Say()
        {
            Console.WriteLine("Gav gav!");
        }
    }


Без интерфейса:
class Dog
    {
        void Say()
        {
            Console.WriteLine("Gav gav!");
        }
    }
  • Вопрос задан
  • 172 просмотра
Решения вопроса 1
DevMan
@DevMan
интерфейс даёт гарантию, что описанные в нем методы реализованны в классе.

покурите тему интерфейсов в целом, и тег ООП на тостере в частности - этот вопрос задавался уже 100писот раз.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
freeExec
@freeExec
Участник OpenStreetMap
Не сможешь хранить в одной переменной кошку, собаку и прочих говорящих роботов.
Ответ написан
Комментировать
zagayevskiy
@zagayevskiy
Android developer at Yandex
Интерфейс это инструмент для абстракции. В твоём примере абстракции нет, более того, он плохой просто потому что никто не строит иерархии животное-кошка/собака. Это бессмысленно, и очень быстро ты уткнешся в рыбу, которая как бы тоже животное, но say к ней неприменимо.
Сделай интерфейс ISpeakeable - т.е., могущий говорить. Сделай метод, который принимает этот интерфейс, и ты поймёшь, чем это хорошо.
Ответ написан
Комментировать
vabka
@vabka Куратор тега C#
Токсичный шарпист
Раз уж на примере животных.

С интефрейсами можно сделать так:
interface ISpeaking {
  public void Speak();
}

public class Dog: ISpeaking {
  public void Speak() => Console.WriteLine("Гав!");
}

public class Cat: ISpeaking {
  public void Speak() => Console.WriteLine("Мяу!");
}

public static void Main() {
 ISpeaking[] speakers = new ISpeaking[] {new Cat(), new Dog()};
 foreach(ISpeaking speaker in speakers)
   speaker.Speak();
}


Более применимый пример - интерфейс IEnumerable.
IEnumerable реализуют разные коллекции: массивы, List, HashSet, Dictionary.
С помощью IEnumerable можно пройтись по всем элементам коллекции. Это позволяет избавиться от дублирования кода:
Без интефрейсов:
static void PrintAll(string[] array) {
  foreach(var e in array)
    Console.WriteLine(e);
}

static void PrintAll(List<string> list) {
  foreach(var e in list) { // Дублирование!
    Console.WriteLine(e);
}


C интерфейсом:
// Можно использовать и для string[], и для List<string>, и даже для того, о чём мы ещё не знаем!
static void PrintAll(IEnumerable<string> collection) {
  foreach(var e in collection) {
    Console.WriteLine(e);
  }
}


Интерфейсы - это один из способов достичь полиморфизма.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы