Ссылка унаследованная класс ype в полученном классе
Вопрос
Я не знаю, возможно ли это или нет, но вот что мне нужно. Я играю с чем -то и хочу знать, возможно ли это, поскольку вы не можете создать свой собственный тип данных на основе герметичного типа, такого как Int, Int32, Int64 и т. Д.
Я хочу создать класс верхнего уровня, который определяется данным типом с некоторыми общими вещами. Затем выведите это в два подкласса, но в этом случае каждый класс основан как на типе INT или Int64. С этого случая создайте экземпляр любого из них и знайте его основу для параметров ссылок / возврата.
Поэтому, когда мне нужно создать экземпляр «ThisClass», мне не нужно знать его тип основы int или int64, но он будет знать тип и смогу позволить вызвать методы/функции с набранными ... Таким образом, если я хочу изменить свое определение ThisClass с Sublevel1 на Sublevel2, мне не нужно танцевать вокруг всех различных определений типа данных.
Надеюсь, это имеет смысл ..
public class TopLevel<T>
{
...
}
public class SubLevel1 : TopLevel<int>
{
...
}
public class SubLevel2 : TopLevel<Int64>
{
...
}
public class ThisClass : SubLevel1
{
...
public <based on the Int data type from SubLevel1> SomeFunc()
{
return <the Int value computed>;
}
}
Решение
Я предполагаю, что некоторое количество должно присутствовать на всех подклассах TopLevel<T>
Итак, вы должны определить это там:
public abstract class TopLevel<T>
{
public TopLevel()
{
}
public abstract T SomeFunc();
}
и конкретные подклассы будут знать параметр общего типа, поэтому этот класс будет определять SomeFunc как:
public class ThisClass : SubLevel1
{ ...
public override int SomeFunc()
{
return <the Int value computed>;
}
}
Другие советы
Это нельзя сделать во время компиляции без параметрирования всех полученных классов:
public class ThisClass<T> : SubLevel1<T> etc etc
Вы можете сделать это во время выполнения с размышлением, осмотрев typeof(ThisClass).BaseType
и т. д. Но это может стать довольно грязным, поскольку вам нужно написать код, который понимает иерархию параметров наследства и общего типа всего базового ствола класса.
Вы не можете сделать это, как спросили.
Однако вы можете написать using MyType = System.Int32;
В верхней части файла, затем используйте MyType
везде в файле. Это позволит вам легко изменить типы.