c# Интерфейсы способы применения

Nechto
Дата: 18.05.2014 13:14:21
Здравствуйте.

Уже как второй день подряд пытаюсь разобраться с для чего нужны эти интерфейсы и абстрактные классы.
Дело в том то мне не ясно, какое преимущество я получаю использую такую логику.

+

Сошлюсь на этот видео урок


Минута снимка 14:18


В видео уроке создан абстрактный класс BaseClass и два интерфейса Zero и First. Базовый класс имеет одно свойство а интерфейсы по одному методу. Далее автор в коде наследует базовый класс и два интерфейса. После описывает эти методы в классе А, которому
Все это наследовалось.
Вот тут вопрос зачем создавать эти два интерфейса, если эти методы можно было описать в базовом классе? И вообще как эти интерфейсы облегчают жизнь?
Shocker.Pro
Дата: 18.05.2014 13:30:58
а) Интерфейсы могут быть применены в РАЗНЫХ классах, а не только в каком-то конкретном, что делает универсальным зоопарки очень разных классов - пример - интерфейс IEnumerable - с помощью него, например, можно пройти foreach-ем массив, тектовую строку, коллекцию, словарь и что угодно, в том числе, ты можешь реализовать IEnumerable на собственном любом классе и потом обходить его foreach-ем или Linq-запросами...

б) Класс может наследовать только одному базовому классу, но любому количеству интерфейсов
Где-то в степи
Дата: 18.05.2014 14:30:53
Nechto,
На самом деле, про интерфейсы столько замысловатых повествований в сети и в учебниках, и что бы вдуплиться
не один день уйдет у новичка.
Вообще то с интерфейсами все просто, у нас запрещено множественное наследование в коде пользователя.
то есть, Вы без труда можете отнаследоваться от абстрактного класса, а от двух? не получится.
Вот тут и создатели пошли на такую хитрость, второй и последующие абстрактные классы они заменили словом интерфейс.
а в самих классах убрали методы с реализацией и конструктор, оставив только абстрактные методы.
то есть интерфейс это такой же абстрактный класс, без методов с реализацией и конструктора, ну естественно финализатор там никто не видел, не верите, откройте байт код и посмотрите, то есть им там можно, множественные наследования, а нам нельзя.Хм...
Если нет конструктора, то естественно конструктор этого абстрактного класса и не будет задействован с стеке вызовов конструкторов
и все увянет на последнем вызове конструктора объекта ( мы говорим про ссылочные типы)
Хотя можно и создать объект и без вызова конструктора
По второму, я согласен с вами ( хотя фильм не смотрел) можно и было бы запихнуть и в базовый класс..
Но бываю в жизни и такие моменты, когда нужно реализовывать И.
например foreach требует что бы левый элемент реализовывал IEnumerable
Ну уж если пошел разговор о IEnumerable
Вспомним про IDisposable вы то его никуда не запихнете в базовый класс.
У вас тогда не встанет директива using
да бог с ней, у вас и не вызовется автовызов исполнения этого интерфейса.
ну не используя using вы додавите Dispose() через базовый класс.
А в другом случае ( вообще два случая авто вызова ( классических)IDisposable )
вообще никакой эрекции не будет..
Как то так..
Сон Веры Павловны
Дата: 18.05.2014 16:56:03
Где-то в степи
то есть интерфейс это такой же абстрактный класс

Да ну, ерунда какая. Если что-то является классом, то это подразумевает реализацию класса, и наследование этой реализации (даже если реализация вырожденная). А интерфейс - это просто контракт, объявляющий, что если некий класс реализует этот интерфейс, то этот класс обязан иметь методы, объявленные в интерфейсе. И все.
Где-то в степи
Дата: 18.05.2014 17:12:41
Сон Веры Павловны,
интерфейс это обыкновенный тип и реализован в виде класса, тоже самое и структуры, имеют реализацию класса
только запечатанного и наследующего valueType, а то о чем вы говорите - это матрица
есть люди которые пишут в байт коде им множественное наследование доступно, на хабре это один перец показательно исполнил..
Изопропил
Дата: 18.05.2014 17:26:25
Сон Веры Павловны
интерфейс - это просто контракт,

не совсем просто - явная реализация интерфейса - тому пример
Antonariy
Дата: 18.05.2014 18:39:12
Изопропил
Сон Веры Павловны
интерфейс - это просто контракт,

не совсем просто - явная реализация интерфейса - тому пример
явная реализация интерфейса это класс.

Сон Веры Павловны, Shocker.Pro +1
Где-то в степи, Изопропил -1
Изопропил
Дата: 18.05.2014 19:00:47
Antonariy
явная реализация интерфейса это класс

что сказать то хотел?
Nechto
Дата: 18.05.2014 19:37:43
Shocker.Pro
а)Интерфейсы могут быть применены в РАЗНЫХ классах

Shocker.Pro
а)можешь реализовать IEnumerable

Сон Веры Павловны
а)А интерфейс - это просто контракт, объявляющий, что если некий класс реализует этот интерфейс, то этот класс обязан иметь методы, объявленные в интерфейсе. И все.


Значит для этого создавались интерфейсы?
Где-то в степи
Дата: 18.05.2014 19:55:09
Antonariy,
автор
Где-то в степи, Изопропил -1

а что не нравится ? можно было бы и без меня привести утиный тест между интерфейсом и абстрактным классом никуда не заглядывая
если уж заговорили про утиную типизацию, то кричать надо на строчку
степь
например foreach требует что бы левый элемент реализовывал IEnumerable

или на
Shocker.Pro
ты можешь реализовать IEnumerable на собственном любом классе и потом обходить его foreach-ем

в общем то эрекция происходит не на IEnumerable , а на IEnumerator GetEnumerator()
 internal class Program
    {
        private static void Main(string[] args)
        {
            var test = new Test();
            try
            {
                foreach (var VARIABLE in test)
                {

                }
            }
            catch { }
            Console.Read();
        }
    }

    class Enumerator : IEnumerator, IDisposable
    {

        public object Current
        {
            get { throw new NotImplementedException(); }
        }

        public bool MoveNext()
        {
            return true;
        }

        public void Reset()
        {
            throw new NotImplementedException();
        }

        public void Dispose()
        {
            Console.WriteLine("dddddddddddddddddd");
        }
    }

    class Test
    {
        public IEnumerator GetEnumerator()
        {
            return new Enumerator();
        }
    }

тут к стати показан второй классический авто вызов IDisposable