Do C # 8 реализации интерфейса по умолчанию допускают множественное наследование - PullRequest
0 голосов
/ 13 ноября 2018

Согласно https://blogs.msdn.microsoft.com/dotnet/2018/11/12/building-c-8-0/, одной из новых функций, появившихся в C # 8, является реализация интерфейсов по умолчанию. Будет ли эта новая функция также неявно разрешать множественное наследование? Если нет, что именно произойдет, если я попробую следующее:

public interface A { int Foo() => 1; }
public interface B { int Foo() => 2; }
public class C : A, B { }

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Mads Torgersen ответил на ваш вопрос в сообщении в блоге, на которое вы ссылались:

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

Итак, с вашим примером:

public interface A { int Foo() => 1; }
public interface B { int Foo() => 2; }
public class C : A, B { }

Вы не можете сделать это:

var something = new C();
var x = something.Foo(); /* does not compile */

Вы можете сделать следующее:

var something = new C();
var x = ((A)something).Foo(); /* calls the implementation provided by A */
var y = ((B)something).Foo(); /* calls the implementation provided by B */
0 голосов
/ 13 ноября 2018

Благодарим @CodeCaster за его / ее замечательные комментарии, которые вызвали этот ответ.

Предложение гласит:

Примечаниечто класс не наследует членов от своих интерфейсов;это не изменяется с помощью этой функции:

Таким образом, кажется разумным (хотя невозможно подтвердить со 100% -ной уверенностью до его отправки), что:

public interface A { int Foo() => return 1; }
public interface B { int Foo() => return 2; }
public class C : A, B { }

будет работать нормально.

Как показано в предложении:

new C().M(); // error: class 'C' does not contain a member 'M'

, тогда мы можем предположить, что ваша версия:

new C().Foo();

также не будет компилироваться.

Предложение показывает:

IA i = new C();
i.M();

как действительное, что эквивалентно вашему:

A i = new C();
i.Foo();

Поскольку i объявлено как тип A, нет оснований предполагать, что то же самоене будет работать, если A было изменено на B - нет никаких коллизий, о которых можно было бы говорить.

Весь смысл этой функции - обеспечить безопасное расширение интерфейсов (см. это видео ).Если это только сработало, если вы реализовали один интерфейс, это, кажется, противоречит цели функции.И учитывая, что эта функция, по-видимому, реализована таким образом, примерно сродни явной реализации интерфейса (именно поэтому мы не можем вызывать C.Foo() напрямую), я думаю, мы можем разумно предположитьчто это, скорее всего, позволит реализовать несколько интерфейсов.

...