Универсальный класс с множественным наследованием - PullRequest
1 голос
/ 05 апреля 2019

Я пытаюсь достичь чего-то определенного в c #, и я не знаю, есть ли у него имя (или даже если это хорошая практика). Я попытался максимально упростить код, потому что это общая проблема (не каламбур, я имею в виду, что он не зависит от остальной части реализации) По сути, у меня есть универсальный класс Class1, класс A, класс B, который наследуется от A, и другой класс Class2, который наследуется от Class1 с B в качестве универсального параметра. Проблема в том, что я получаю сообщение об ошибке «не могу преобразовать из« Class2 »в« Class1 »» при попытке привести.

Я пробовал разные комбинации и провел часы и проверил десятки ссылок, но пока не могу найти ответ на эту проблему. Имейте в виду, я довольно новичок в программировании (несколько лет, но я учился сам)

public class Class1<T> where T : A
{
    public string name;
}

public class Class2 : Class1<B> { }

public class A { }
public class B : A { }

//if I change the parameter type to Class1<B>, but that defeats the purpose
//of being able to call this function with any class that extends Class1
void TestFunction(Class1<A> test)
{
    Debug.Log(test.name);
}

//I basically want to do this
var instance = new Class2();

//I can't do this because instance is of type Class2 but can't be converted
//to Class1<A>    
TestFunction(instance);

Я хочу иметь возможность иметь классы, расширяющие class1, например class2, с параметрами, расширяющими A, например, B, но по причине, которую я не могу понять, это не работает таким образом. Спасибо за любую помощь! Я как бы над головой и чувствую, что никогда не найду решение, которое работает на моем уровне.

1 Ответ

1 голос
/ 05 апреля 2019

Чтобы это работало, вам нужно настроить функцию в общем виде, предоставляя все, что нужно компилятору для ее разрешения как A. Не совсем приятно повторять ограничения, но это работает.

static void TestFunction<T>(Class1<T> test) where T : A
{

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...