Тема: Проблема з наслідуванням одноіменних інтерфейсів (generic)
Досить давно програмую на C#, але тільки недавно помітив таку цікаву штуку:
C# v3.0 (принаймні в VisualStudio) не підтримує множинне наслідування однакових generic-інтерфейсів з різними типами-параметрами (на Java така сама біда твориться).
Наприклад наступний код не компілюється:
public interface MyInterface<T>
{
T GetData();
void SetData(T data);
}
public class MyClass<T1, T2> : MyInterface<T1>, MyInterface<T2>
{
private T1 _t1;
private T2 _t2;
public T1 GetData() { return _t1; }
public void SetData(T1 data) { _t1 = data; }
T2 MyInterface<T2>.GetData() { return _t2; }
public void SetData(T2 data) { _t2 = data; }
}
Пише, що не можна наслідувати обидва інтерфейси, бо T1 може бути таким як T2.
Ну це ще можна би було зрозуміти, але я спробував наступний код:
public class C1 { }
public class C2 { }
public interface MyInterface<T>
{
T GetData();
void SetData(T data);
}
public class MyClass<T1, T2> : MyInterface<T1>, MyInterface<T2>
where T1 : C1
where T2 : C2
{
private T1 _t1;
private T2 _t2;
public T1 GetData() { return _t1; }
public void SetData(T1 data) { _t1 = data; }
T2 MyInterface<T2>.GetData() { return _t2; }
public void SetData(T2 data) { _t2 = data; }
}
і він теж не компілюється (виводить таке ж повідомлення як і перед тим).
Але я вирішив не здаватися і попробував до першого варіанту дописати допоміжний клас:
public interface MyInterface<T>
{
T GetData();
void SetData(T data);
}
public class Helper<T> : MyInterface<T>
{
private T _t1;
public T GetData() { return _t1; }
public void SetData(T data) { _t1 = data; }
}
public class MyClass<T1, T2> : Helper<T1>, MyInterface<T2>
{
private T2 _t2;
T2 MyInterface<T2>.GetData() { return _t2; }
public void SetData(T2 data) { _t2 = data; }
}
І тут сталося диво ...
З допоміжним класом все запрацювало.
Скажіть мені хто-небудь, чому таке наслідування (як на початку) не дозволяється ?
Чому останній варіант - норм, а перший ні ?
Адже по суті MyClass і в першому і в останньому випадках однаковий.
Чим керувалися розробники мов програмування ?
Можливо ви теж зіштовхувалися з такою проблемою, напишіть як ви її вирішували.