Тема: Як створити змінну типу об'єднання кількох інтерфейсів ? (Вирішено)
Є бібліотека стороннього розробника, в тій бібліотеці є класи та інтерфейси, наприклад:
namespace SomeSpace
{
public interface I1
{
void f1();
}
public interface I2
{
void f2();
}
public class C : I1, I2 //, ...
{
public void f1() { } // implement I1.f1();
public void f2() { } // implement I2.f2();
public void f3() { } // implement other interface member.
// ...
}
}
Я підключив цю бібліотеку до свого проекту і створив екземпляр класу C, далі я хочу помістити (присвоїти) цей екземпляр в змінну такого типу, який дозволить викликати (через крапку) будь-які властивості і методи інтерфейсів I1, I2, і не дозволить викликати інші властивості і методи класу C.
В ідеалі я б хотів, щоб це виглядало як в наступному прикладі в стрічках перед "// Error N", де N - це цифра.
using SomeSpace
namespace MySpace
{
public interface I12 : I1, I2
{ }
public class Program
{
public static void Main(string[] args)
{
C c = new C();
I1 i1 = c; // OK
I2 i2 = c; // OK
// I12 i = c; // Error 1
// I1, I2 i = c; // Error 2
// {I1, I2} i = c; // Error 3
i.f1(); // OK
i.f2(); // OK
// i.f3(); // Error here is OK
}
}
}
Звичайно, що Visual Studio на таке свариться (якщо розкоментувати рядки з Error 1, 2, 3), каже щоб я йшов туди, куди сам часто посилаю, на офіційну документацію по синтаксису.
Я знаю, що це можна реалізувати наступним способом:
using SomeSpace
namespace MySpace
{
public interface I12 : I1, I2
{ }
public class CC<T> : I12
where T : I1, I2
{
private T _t;
public CC(T t) { _t = t; }
public void f1() { _t.f1(); } // implement I1.f1();
public void f2() { _t.f2(); } // implement I2.f2();
}
public class Program
{
public static void Main(string[] args)
{
C c = new C();
I1 i1 = c; // OK
I2 i2 = c; // OK
I12 i = new CC<C>(c); // OK
i.f1(); // OK
i.f2(); // OK
// i.f3(); // Error here is OK
}
}
}
Але тепер уявіть собі, що насправді інтерфейси мають не один метод, а від 20 до 50 методів. Це означає, що я мушу написати від 40 до 100 стрічок коду тільки для того, щоб досягнути поставленої цілі, і це тільки в одному класі. Дибілізм же. Гарного рішення я не знайшов.
Якщо хтось знає, як це культурно зробити, підкажіть.