- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
using System;
public class Test
{
class R { }
class A : R { }
class B : R { }
static void pituh(A x, R y){
Console.WriteLine("A R");
}
static void pituh(R x, B y){
Console.WriteLine("R B");
}
static void pituh(R x, R y){
Console.WriteLine("R R");
}
static void d(R x, R y)
{
dynamic a = x;
dynamic b = y;
pituh(a, b);
}
public static void Main(string[] args)
{
d(new A(),new R());
d(new A(),new B()); //Runtime error
d(new B(),new A()); //Runtime error
}
}
Пробуем мультиметоды в до-диезе.
https://ideone.com/Jm5LJA
Her 09.03.2018 18:17 # 0
The call is ambiguous between the following methods or properties: `Test.pituh(Test.A, Test.R)' and `Test.pituh(Test.R, Test.B)'
3.14159265 09.03.2018 19:59 # +2
«все правильно»
bormand 09.03.2018 20:02 # 0
3.14159265 09.03.2018 20:06 # 0
Там еще наверняка траблы с множественным наследованием.
Когда A implements B,C,D то непонятно какой метод выбрать.
Тот же CLOS по идее должен вызвать B
Her 10.03.2018 00:16 # 0
SemaReal 10.03.2018 19:25 # 0
Her 12.03.2018 13:55 # 0
а потом в методе своим любимым сериалайзером его парсить
SemaReal 12.03.2018 14:01 # 0
Тогда почему не Stream?
Her 12.03.2018 15:08 # 0
SemaReal 12.03.2018 15:26 # +1
Her 12.03.2018 15:35 # −1
можно и без авто гетеров/сетеров и экстеншн методов
но с ними удобнее. и тут так-же
SemaReal 12.03.2018 15:50 # 0
еще можно делать утиную типизацию: вызываешь метод foo(), и надо он был реализован у аргумента, а конкретный интерфейс наследовать не нужно
inho 14.03.2018 20:02 # 0
Desktop 09.03.2018 18:35 # 0
SemaReal 10.03.2018 15:28 # 0
Если можно, то в C# есть самый настоящий мультидиспатч без всяких динамиков для вирт. функций.
И в жабе есть (собссно, он там только такой и есть).
Но вообще отказываться от стат типизации и пердолиться с dynamic как-то странно. Старый жабоёб/сишарпер сделал бы или visitor или свитч по тайпу