Почему базовый класс должен быть указан перед интерфейсами при объявлении производного класса? - PullRequest
6 голосов
/ 15 апреля 2011
public interface ITest
{
    int ChildCount { get; set; }
}

public class Test
{
}

public class OrderPool : ITest, Test
{
    public int ChildCount
    {
        get;
        set;
    }
}

Ошибка говорит о том, что базовый класс 'Test' должен предшествовать любым интерфейсам.Зачем сначала расширять класс, а затем реализовывать интерфейс?

Ответы [ 7 ]

16 голосов
/ 15 апреля 2011

Поскольку спецификация говорит об этом в разделе §17.1.2.

8 голосов
/ 15 апреля 2011

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

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

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

class MyDerivedClass : A, B, C, D, E   // which is the base class?  
{
...
}
3 голосов
/ 15 апреля 2011

он называется синтаксис

Существует соглашений , которым вы должны следовать, чтобы компилятор скомпилировал код.

Они могли бы разрешить обе формы или просто наоборот, но они этого не сделали.Причина, вероятно, в ясности: вы можете определить множество интерфейсов и наследовать только от одного класса.

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

2 голосов
/ 15 апреля 2011

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

class CLASSNAME:baseclass? interface*

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

2 голосов
/ 15 апреля 2011

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

1 голос
/ 15 марта 2016

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

1 голос
/ 15 апреля 2011

Вы можете наследовать только от одного базового класса, но многих интерфейсов.Поэтому, если в списке более одного типа, вы знаете, что первый - это класс, остальные - интерфейсы.Это работает независимо от соглашений об именах классов / интерфейсов

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