C # - Разъяснение интерфейса - PullRequest
3 голосов
/ 03 октября 2009

Я прочитал несколько пунктов об интерфейсе:

" Интерфейс - это определение контракта, которому должен соответствовать класс. унаследовать что угодно. "

, определяя разницу между интерфейсом и абстрактным классом, могу сказать:

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

Ответы [ 7 ]

3 голосов
/ 03 октября 2009

да, вы правы. Интерфейс - это просто контракт с классом.

примечание: интерфейсы не являются производными от типа System.Object . Интерфейс это просто абстрактный тип, который состоит из набора виртуальных методов, каждый со своим именем, параметрами, и тип возврата. Методы интерфейса не могут содержать какую-либо реализацию; следовательно, типы интерфейса являются неполными (аннотация).

Например:

interface I1
{
}
interface I2
{
}

abstract class a1
{
}
abstract class a2
{

}
class App:a1,I1,I2  //no Error
{   
static void Main(string[] args)
{       
}
}

примечание: CLR позволяет типу наследовать только от одного другого типа, для которого System.Object является корневым базовым типом

       interface I1
        {
        }
        interface I2
        {
        }

        abstract class a1
        {
        }
        abstract class a2
        {

        }
        class App:a1,a2,I1,I2  //  Error
        {   
        static void Main(string[] args)
        {       
        }
        }
2 голосов
/ 03 октября 2009

Да .. Вы правы, просто суммируя

Что такое абстрактный класс?

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

Что такое интерфейс?

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

Оба вместе

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

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

1 голос
/ 03 октября 2009

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

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

Тем не менее, abstract class может предоставить столько реализации, сколько ему нужно или нужно. Он может сам реализовать интерфейс. Все, что требуется от абстрактного класса - это то, что он помечен abstract. Его члены могут быть переопределены производными классами, помечая методы virtual в абстрактном (базовом) классе и используя ключевое слово overrides в производном классе. Но абстрактный базовый класс не обязан предоставлять какую-либо функциональность вообще; и при этом он не обязан предоставлять минимальное количество виртуальных методов, которые не реализуются.

Надеюсь, это поможет!

1 голос
/ 03 октября 2009

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

Интерфейсы могут быть получены из других интерфейсов.

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

1 голос
/ 03 октября 2009

когда класс является производным от абстрактного класс это известно как настоящий Наследование. Когда класс использует интерфейс тогда это не наследование, это реализация контракты?

  • Да
1 голос
/ 03 октября 2009

Когда класс использует интерфейс, тогда это не наследство, это выполнение договоров

Да, именно так.

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

interface IA
{
    void MethodA();
}

interface IB : IA
{
    void MethodB();
}

class B : IB
{
    public void MethodA() { }
    public void MethodB() { }

}

class AB : IA, IB
{
    public void MethodA() { }
    public void MethodB() { }
}

Если вы изучите код IL классов B и AB (используя ildasm или аналогичный), вы обнаружите, что оба класса идентичны в том, какие интерфейсы они реализуют. Интерфейс IB работает как «ярлык» и включает в себя также интерфейс IA, но в традиционном смысле наследование отсутствует.

0 голосов
/ 03 октября 2009

Интерфейс определяет интерфейс. Просто подумайте о слове интерфейс.

Simple.

Он определяет, как вы взаимодействуете (взаимодействуете) с классом.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...