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

ю, что абстрактный класс - это особый класс, который не может быть создан. Абстрактный класс должен быть только подклассифицирован (унаследован от). Другими словами, он только позволяет другим классам наследовать от него, но не может быть создан. Преимущество состоит в том, что он обеспечивает определенные иерархии для всех подклассов. Проще говоря, это своего рода контракт, который заставляет все подклассы придерживаться одинаковых иерархий или стандартов.

Также я знаю, что интерфейс - это не класс. Это сущность, которая определяется словом Интерфейс. Интерфейс не имеет реализации; он имеет только подпись или, другими словами, только определение методов без тела. Как одно из сходств с абстрактным классом, это контракт, который используется для определения иерархий для всех подклассов или он определяет конкретный набор методов и их аргументы. Основное различие между ними заключается в том, что класс может реализовывать более одного интерфейса, но может наследовать только от одного абстрактного класса. Поскольку C # не поддерживает множественное наследование, интерфейсы используются для реализации множественного наследования.

Когда мы создаем интерфейс, мы в основном создаем набор методов без какой-либо реализации, которые должны быть переопределены реализованными классами. Преимущество состоит в том, что он позволяет классу быть частью двух классов: одного из иерархии наследования и одного из интерфейса.

Когда мы создаем абстрактный класс, мы создаем базовый класс, который может иметь один или несколько завершенных методов, но по крайней мере один или несколько методов остаются незавершенными и объявляются абстрактными. Если все методы абстрактного класса не завершены, то это то же самое, что и интерфейс.

НО НО НО

Я заметил что у нас будетМетоды интерфейса по умолчанию в C # 8.0

Может быть, я спрашиваю об этом, потому что у меня есть только 1-2 года опыта в программировании, но в чем будет основное отличие абстрактного класса от интерфейса сейчас?

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

 Ed Plunkett01 дек. 2017 г., 22:18
Недавно я заметил, что C # 6 предназначался для демонстрации убывающей отдачи в дизайне языка программирования, а C # 7 предназначался для демонстрации убывающей отдачи в демонстрациях убывающей отдачи. Вы можете увидеть, где это происходит с C # 8. Он складывается в нечто вроде четырехмерного снежного шара. Microsoft должна найти этих парней новый язык для работы. Это сделано. У него есть все функции.
 Ed Plunkett01 дек. 2017 г., 22:24
На самом деле мне очень нравится идея необнуляемых ссылочных типов.
 itsme8601 дек. 2017 г., 22:32
@EdPlunkett Ха! я думалименно так что при завершении вашего предыдущего комментария. Это может быть потому, что я только что прочитал статью о них этим утром.
 Olivier Jacot-Descombes24 дек. 2017 г., 18:37
Я согласен с тем, что методы интерфейса по умолчанию добавляют путаницу, если только не используются в качестве черт, для которых мы должны ввести соглашение об именовании (например,IFooTrait или простоFooTrait).
 BJ Myers01 дек. 2017 г., 22:06
Честно? Они станут почти идентичными, в то же время введя mock-множественное наследование в C #. Это одна из главных причин того, что многие разработчики C # (включая меня) полностью против этой функции.

Ответы на вопрос(3)

Решение Вопроса

не большая разница между ними, за исключением очевидного факта, что абстрактные классы могут иметь состояние, а интерфейсы - нет. Методы по умолчанию или также известный какметоды виртуального расширения на самом деле были доступны в Java некоторое время. Основной диск для методов по умолчаниюэволюция интерфейса это означает возможность добавлять методы к интерфейсу в будущих версиях, не нарушая совместимость с исходным кодом или двоичную версию с существующими реализациями этого интерфейса.

еще пара хороших моментов, упомянутых этимПочта:

Эта функция позволяет C # взаимодействовать с API-интерфейсами, ориентированными на Android (Java) и iOs (Swift), которые поддерживают аналогичные функции.Оказывается, добавление реализаций интерфейса по умолчанию обеспечивает элементы языковой особенности "черты" (https://en.wikipedia.org/wiki/Trait_(computer_programming)). Черты оказались мощным методом программирования (http://scg.unibe.ch/archive/papers/Scha03aTraits.pdf).
 davidbak29 нояб. 2018 г., 03:33
w.r.t.Java IMO причина, по которой у Java есть методы по умолчанию (низшая конструкция), заключается в том, что они не могли проглотить копирование гораздо лучших методов расширения C #. Теперь C # скопировал методы по умолчанию из Java без уважительной причины, вместо того, чтобы обеспечить истинную реализацию черт (которые имеют состояние).

ковариация / контравариантность.

Если честно, никогда не оказывался в ситуации, когда подразумевался дефолт. в интерфейсе было решение. Я немного скептически отношусь к этому.

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

abstract class LivingEntity
{
    public int Health
    {
        get;
        protected set;
    }


    protected LivingEntity(int health)
    {
        this.Health = health;
    }
}

class Person : LivingEntity
{
    public Person() : base(100)
    { }
}

class Dog : LivingEntity
{
    public Dog() : base(50)
    { }
}

Ваш ответ на вопрос