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 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