Ссылка унаследованная класс ype в полученном классе

StackOverflow https://stackoverflow.com/questions/2449873

  •  20-09-2019
  •  | 
  •  

Вопрос

Я не знаю, возможно ли это или нет, но вот что мне нужно. Я играю с чем -то и хочу знать, возможно ли это, поскольку вы не можете создать свой собственный тип данных на основе герметичного типа, такого как 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 везде в файле. Это позволит вам легко изменить типы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top