public class CNumber<T> // : ...
{
private T value;
CNumber()
{
}
// ...
}
С# : Проверка реализации интерфейса
Я с языке с# новичок, тут вот решил поупражняться: допустим я реализую класс число так:
Код:
Вот, этот класс реализует некие интерфесы, короче ладно, вопрос ввобще (в принципе )не относиться к предыдуущемы коду:
Как узнать реализует ли T, который будет подставлен, нужные мне интерфейсы естественно на этапе компиляции.
По-моему коммпилятор может это сделать? Или я ошибаюсь? Но если это нельзя сделать прямо, может есть какая обходная техника?
private T m_Value;
...
IInterface I=m_Value as IInterface;
Переменная I содержит null, если интерфейс IInterface не поддерживается, и ссылку, если интерфейс поддерживается. Такая проверка справедлива, если переменная m_Value инициализирована.
я сделал так (проверка реализации интерфейса на этапе компиляции) "на этапе компиляции" - ключевое в предыдущем посте, так вот
Код:
public class CNumber<T>
where T : MyInterface
{
// ...
}
where T : MyInterface
{
// ...
}
но это не самое главное, теперь вот пожалуй главная проблема:
Некоторые классы имеют в себе реализованные методы, (ни как не подтверждённые интерфейсом), в моём случае это операторы +, - , * , /. И вот, надо как-то сделать так чтобы , вставляя эти классы в CNumber, я мог вызывать их отдуда.
Это так просто не сделать так ка надо явно указывать интерфейс в списке предков класса, если класс мой то всё без проблем, а вот если это int, например.
Ну вот мои попытки:
Например я думал что можно было бы конечно заставить T реализовывать интерфейс IConvertable, пребразовать к типу соответсвующему и вызвать операцию для него, но если это тип CPoint, или тогда пришлось бы например для типа int выполнять операцию как для double.
Скорре всего надо всё это как-то хитро пропустить через какой-то обёрточный универсальный класс. Незнаю.
А может в C# это вообще как-то по другому решаеться. (У меня может просто привычки C++-овкие).
public class SomeClass<T>
{
public SomeClass(T value)
{
Type t=typeof(T);
bool IsInt=t.Equals(typeof(int));
bool IsDouble=t.Equals(typeof(double));
...
}
}
Потом, когда определяется нужный тип, приводим значение value непосредственно к определённому типу и выполняем операции сложения.