Как я могу объявить переменную в классе MainForm типа «Универсальный класс» без указания универсального типа - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть следующий родовой класс:

internal class AutoRegisterThread<T> where T: AutoRegisterAbstract
{
field1....
method1...
}

У меня есть 5 классов, которые реализуют AutoRegisterAbstract (абстрактный класс).

и в моей главной форме (внутренний частичный класс MainForm: Form)Мне нужно объявить поле:

AutoRegisterThread<> _currentThread

без указания универсального типа, потому что я могу инициировать _currentThread как:

_currentThread=new AutoRegisterThread<implementedClass1> 

или

_currentThread=new AutoRegisterThread<implementedClass2>

_currentThread: будет использоваться в форме (во многих случаях)

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Наследовать от неуниверсального базового класса:

internal abstract class AutoRegisterThreadBase { }

internal class AutoRegisterThread<T> : AutoRegisterThreadBase 
   where T: AutoRegisterAbstract
{
field1....
method1...
}

Ваше основное поле формы теперь может иметь тип AutoRegisterThreadBase

Обратите внимание, если необходимо, неуниверсальный родительский классможет иметь то же имя, что и общий класс;в вашем случае AutoRegisterThread.

РЕДАКТИРОВАТЬ : расширенный пример с использованием:

internal abstract class AutoRegisterThreadBase { /* Leave empty, or put methods that don't depend on typeof(T) */ }
internal abstract class AutoRegisterAbstract { /* Can have whatever code you need */ }

internal class AutoRegisterThread<T> : AutoRegisterThreadBase
    where T : AutoRegisterAbstract
{
    private int someField;
    public void SomeMethod() { }        
}

internal class AutoRegisterWidget : AutoRegisterAbstract { /* An implementation of AutoRegisterAbstract; put any relevant code here */ }

// A type that stores an AutoRegisterThread<T> (as an AutoRegisterThreadBase)
class SomeType
{
    public AutoRegisterThreadBase MyAutoRegisterThread { get; set; }
}

// Your code that uses/calls the above types
class Program
{        
    static void Main(string[] args)
    {
        var someType = new SomeType();

        // Any sub-class of AutoRegisterThreadBase, including generic classes, is valid
        someType.MyAutoRegisterThread = new AutoRegisterThread<AutoRegisterWidget>();

        // You can then get a local reference to that type 
        // in the code that's created it - since you know the type here
        var localRefToMyAutoRegisterThread = someType.MyAutoRegisterThread as AutoRegisterThread<AutoRegisterWidget>;
        localRefToMyAutoRegisterThread.SomeMethod();
    }
}
0 голосов
/ 17 февраля 2019

Если у вас есть универсальный класс в C #, вы должны предоставить параметр типа.Вы можете написать другой класс, который не будет универсальным.Если есть какая-либо логика, которая должна быть разделена между общими и неуниверсальными классами, вы можете переместить эту логику в еще один новый класс.

...