powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / что будет с интерфейсами?
25 сообщений из 65, страница 1 из 3
что будет с интерфейсами?
    #39856543
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
что будет с интерфейсами?
    #39856603
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,

дефолтная имплементация интерфейсов настолько жуткая и сложная в использовании вещь, что если и взлетит, то очень ограниченно, в рамках каких-нибудь сложных библиотек
...
Рейтинг: 0 / 0
что будет с интерфейсами?
    #39856617
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Осталось добавить поля в интерфейсы чтобы писать дефолтные имплементации.
...
Рейтинг: 0 / 0
что будет с интерфейсами?
    #39856679
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, как будет решаться коллизия в случае множественной реализации интерфейсов с совпадающей сигнатурой методов в дефолтной имплементации.
...
Рейтинг: 0 / 0
что будет с интерфейсами?
    #39856724
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,
Будет требоваться явная реализация?
...
Рейтинг: 0 / 0
что будет с интерфейсами?
    #39856729
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WorobjoffОсталось добавить поля в интерфейсы чтобы писать дефолтные имплементации.
Будут, правда пока статические.
Пишут, что все это нужно для взаимодействия/совместимости с java и ios.
...
Рейтинг: 0 / 0
что будет с интерфейсами?
    #39856795
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныИнтересно, как будет решаться коллизия в случае множественной реализации интерфейсов с совпадающей сигнатурой методов в дефолтной имплементации.

в смысле, как?

нет никакой коллизии.
дефолтную реализацию метода интерфейса можно вызвать только через этот интерфейс.

имея ссылку на класс, реализующий некий интерфейс, нельзя вызвать дефолтную реализацию интерфейса.
нужно сначала привести ссылку к интерфейсу.
...
Рейтинг: 0 / 0
что будет с интерфейсами?
    #39856806
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttСон Веры ПавловныИнтересно, как будет решаться коллизия в случае множественной реализации интерфейсов с совпадающей сигнатурой методов в дефолтной имплементации.

в смысле, как?

нет никакой коллизии.
дефолтную реализацию метода интерфейса можно вызвать только через этот интерфейс.

имея ссылку на класс, реализующий некий интерфейс, нельзя вызвать дефолтную реализацию интерфейса.
нужно сначала привести ссылку к интерфейсу.
Это и есть коллизия.
Ты попробуешь уже написанное приложение перевести на C# 8, у тебя приложение написано с модными нынче UnityContainer, а тут тебе опачки! Не работает больше метод отрезолвленного класса.
...
Рейтинг: 0 / 0
что будет с интерфейсами?
    #39856808
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WorobjoffЭто и есть коллизия.
Ты попробуешь уже написанное приложение перевести на C# 8, у тебя приложение написано с модными нынче UnityContainer, а тут тебе опачки! Не работает больше метод отрезолвленного класса.

Не понял в чём коллизия.
...
Рейтинг: 0 / 0
что будет с интерфейсами?
    #39856847
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttСон Веры ПавловныИнтересно, как будет решаться коллизия в случае множественной реализации интерфейсов с совпадающей сигнатурой методов в дефолтной имплементации.

в смысле, как?

нет никакой коллизии.
дефолтную реализацию метода интерфейса можно вызвать только через этот интерфейс.

имея ссылку на класс, реализующий некий интерфейс, нельзя вызвать дефолтную реализацию интерфейса.
нужно сначала привести ссылку к интерфейсу.Во-первых, фактически не "интерфейс имеет" дефолтную реализацию, а его члены могут ее иметь или не иметь. Дефолтная реализация члена интерфейса означает, что явно этот член в классе реализовывать не нужно. А во-вторых, если же реализация присутствует, то ссылка, приведенная к интерфейсу, не должна дергать дефолтные реализации членов, иначе по писе пойдут все реализации в классах и их оверрайды. То есть накроется один из столпов ООП - полиморфизм.
...
Рейтинг: 0 / 0
что будет с интерфейсами?
    #39856848
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А коллизии действительно нет.
...
Рейтинг: 0 / 0
что будет с интерфейсами?
    #39856857
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот эта хрень




полностью аналогична этой:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public interface ILogger
{
    void Log(LogLevel level, string message);
    void Log(Exception ex);
}

public abstract class BaseLogger 
{
    public void Log(Exception ex) => Log(...);
}

public class InitialLogger : BaseLogger, ILogger 
{
    public void Log(LogLevel level, string message)
    {
    ...
    }
}


Ровно та же "коллизия", которой нет. Просто синтаксический сахар, делающий ненужными некоторые базовые классы.
...
Рейтинг: 0 / 0
что будет с интерфейсами?
    #39856899
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyРовно та же "коллизия", которой нет. Просто синтаксический сахар, делающий ненужными некоторые базовые классы.
Ну хорошо, а если
public class InitialLogger : ILogger1, ILogger2
и в ILogger1, и в ILogger2 есть своя дефолтная реализация void Log(Exception ex), а в самом InitialLogger нет? Вроде как коллизия есть?
...
Рейтинг: 0 / 0
что будет с интерфейсами?
    #39856916
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LR,

А вот это вопрос интересный. Фактически дефолтные реализации дают нам фишку с++ - множественное наследование. Какой метод будет дергаться через наследника в с++, если два базовых класса имеют одинаковые методы? Не знаю, на плюсах не писал, но ведь как-то это разруливается.
...
Рейтинг: 0 / 0
что будет с интерфейсами?
    #39856918
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно в такой ситуации придется явно реализовать хотя бы один из методов. В этой ситуации приведение к реализованному интерфейсу будет дергать реализацию, а к нереализованному - дефолт. По крайней мере это логично.
...
Рейтинг: 0 / 0
что будет с интерфейсами?
    #39856920
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyLR,

А вот это вопрос интересный. Фактически дефолтные реализации дают нам фишку с++ - множественное наследование. Какой метод будет дергаться через наследника в с++, если два базовых класса имеют одинаковые методы? Не знаю, на плюсах не писал, но ведь как-то это разруливается.
Разруливаться это будет очень просто : при возникновении коллизии ромба компилятор будет выдавать болт, и вызвать нужный метод можно будет только явным приведением к типу, у которого эта коллизия отсутствует. Проверил, всё так и есть.
В общем случае фича именно дефолтных реализаций сильно напоминает EIMI, только без ручного прописывания реализации в имплементоре, так что именно в этой фиче ничего ужасного не вижу. Остальное - пока не знаю. Например, в интерфейсах стали допустимы квалификаторы abstract и virtual. К чему бы это, и для чего - пока представить не могу.
...
Рейтинг: 0 / 0
что будет с интерфейсами?
    #39856921
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, с т.з. CIL интерфейс является абстрактным классом, и теоретически может иметь имплементацию, как и абстрактный класс. И новая фича на уровне IL действительно похожа на абстрактный класс - за вычетом наличия конструктора (неявного) у класса (использовался интерфейс из примеров кода по ссылке выше), и директивы newslot virtual у реализованного метода дефолтной имплементации (т.е. теоретически её можно переопределить, только вот как - пока не нашел):
C#:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
interface IDeveloper
{
  void Foo();
  void LearnNewLanguage(string language)
  {
    Console.WriteLine($"Learning {language} in a default way.");
  }
}

abstract class Developer
{
  public abstract void Foo();
  public void LearnNewLanguage(string language)
  {
    Console.WriteLine($"Learning {language} in a default way.");
  }
}


IL:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
.class interface private auto ansi abstract test80.IDeveloper
{
  // Methods
  .method public hidebysig newslot abstract virtual 
    instance void Foo () cil managed 
  {
  } // end of method IDeveloper::Foo

  .method public hidebysig newslot virtual 
    instance void LearnNewLanguage (
      string language
    ) cil managed 
  {
    // Method begins at RVA 0x2084
    // Code size 24 (0x18)
    .maxstack 8

    IL_0000: nop
    IL_0001: ldstr "Learning "
    IL_0006: ldarg.1
    IL_0007: ldstr " in a default way."
    IL_000c: call string [System.Runtime]System.String::Concat(string, string, string)
    IL_0011: call void [System.Console]System.Console::WriteLine(string)
    IL_0016: nop
    IL_0017: ret
  } // end of method IDeveloper::LearnNewLanguage

}

.class private auto ansi abstract beforefieldinit test80.Developer
  extends [System.Runtime]System.Object
{
  // Methods
  .method public hidebysig newslot abstract virtual 
    instance void Foo () cil managed 
  {
  } // end of method Developer::Foo

  .method public hidebysig 
    instance void LearnNewLanguage (
      string language
    ) cil managed 
  {
    // Method begins at RVA 0x20e0
    // Code size 24 (0x18)
    .maxstack 8

    IL_0000: nop
    IL_0001: ldstr "Learning "
    IL_0006: ldarg.1
    IL_0007: ldstr " in a default way."
    IL_000c: call string [System.Runtime]System.String::Concat(string, string, string)
    IL_0011: call void [System.Console]System.Console::WriteLine(string)
    IL_0016: nop
    IL_0017: ret
  } // end of method Developer::LearnNewLanguage

  .method family hidebysig specialname rtspecialname 
    instance void .ctor () cil managed 
  {
    // Method begins at RVA 0x20f9
    // Code size 8 (0x8)
    .maxstack 8

    IL_0000: ldarg.0
    IL_0001: call instance void [System.Runtime]System.Object::.ctor()
    IL_0006: nop
    IL_0007: ret
  } // end of method Developer::.ctor
}
...
Рейтинг: 0 / 0
что будет с интерфейсами?
    #39856981
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныНапример, в интерфейсах стали допустимы квалификаторы abstract и virtual. К чему бы это, и для чего - пока представить не могу.Очевидно, для того, чтобы интерфейсы-наследники были обязаны иметь или могли оверрайдить дефолтные имплементации.
...
Рейтинг: 0 / 0
что будет с интерфейсами?
    #39856982
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Главный вопрос во всем этом - как это продать бизнесу?
...
Рейтинг: 0 / 0
что будет с интерфейсами?
    #39856988
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныИнтересно, как будет решаться коллизия в случае множественной реализации интерфейсов с совпадающей сигнатурой методов в дефолтной имплементации.
Сон Веры ПавловныРазруливаться это будет очень просто:Собственно, это та же самая коллизия, что у базовых классов.
...
Рейтинг: 0 / 0
что будет с интерфейсами?
    #39857004
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyСон Веры ПавловныНапример, в интерфейсах стали допустимы квалификаторы abstract и virtual. К чему бы это, и для чего - пока представить не могу.Очевидно, для того, чтобы интерфейсы-наследники были обязаны иметь или могли оверрайдить дефолтные имплементации.
Нет:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
interface IFoo1
{
  abstract void Bar();
  public virtual void Zot() {}
}

interface IFoo2 : IFoo1
{
  public override void Zot() {} // CS0106 The modifier 'override' is not valid for this item
}


Убираем override - получаем
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
interface IFoo1
{
  abstract void Bar();
  public virtual void Zot() {}
}

interface IFoo2 : IFoo1
{
  public void Zot() {} // CS0108: 'IFoo2.Zot()' hides inherited member 'IFoo1.Zot()'. Use the new keyword if hiding was intended.
}


И никаких требований заимлементить в IFoo2 абстрактный Bar от IFoo1.
...
Рейтинг: 0 / 0
что будет с интерфейсами?
    #39857018
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttWorobjoffЭто и есть коллизия.
Ты попробуешь уже написанное приложение перевести на C# 8, у тебя приложение написано с модными нынче UnityContainer, а тут тебе опачки! Не работает больше метод отрезолвленного класса.

Не понял в чём коллизия.
Как я понял из той статьи. Иерархия наследования интерфейсов "ромб". С одной ветки приходит дефолтная реализация метода, с другой объявление, без реализации. Прикладной разработчик резолвит свой класс который наследует низу "ромба". Вызывает метод который он переопределил своем классе. Какой метод будет вызван?
...
Рейтинг: 0 / 0
что будет с интерфейсами?
    #39857038
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныAntonariyпропущено...
Очевидно, для того, чтобы интерфейсы-наследники были обязаны иметь или могли оверрайдить дефолтные имплементации.
Нет:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
interface IFoo1
{
  abstract void Bar();
  public virtual void Zot() {}
}

interface IFoo2 : IFoo1
{
  public override void Zot() {} // CS0106 The modifier 'override' is not valid for this item
}


Убираем override - получаем
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
interface IFoo1
{
  abstract void Bar();
  public virtual void Zot() {}
}

interface IFoo2 : IFoo1
{
  public void Zot() {} // CS0108: 'IFoo2.Zot()' hides inherited member 'IFoo1.Zot()'. Use the new keyword if hiding was intended.
}


И никаких требований заимлементить в IFoo2 абстрактный Bar от IFoo1.Тогда действительно не ясно, нафига они.
...
Рейтинг: 0 / 0
что будет с интерфейсами?
    #39857042
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WorobjoffКакой метод будет вызван?Никакой, компилятор попросит разработчика избавить его от коллизий.
...
Рейтинг: 0 / 0
что будет с интерфейсами?
    #39857073
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,
Вот такой ромб
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
    interface IA
    {
        string A();
    }

    interface IB1 : IA
    {
        string B(); // здесь метод по-умолчанию
    }

    interface IB2 : IA
    {
        string B();
    }

    interface IC : IB1, IB2
    {

    }

    class C : IC
    {
        public string A()
        {
            return "A";
        }

        public string B()
        {
            return "B";
        }
    }


У меня нет C# 8, поэтому не знаю как оно будет.
...
Рейтинг: 0 / 0
25 сообщений из 65, страница 1 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / что будет с интерфейсами?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]