У меня есть два базовых класса. Второй родовой класс имеет ограничение на его параметр первого класса.
abstract class FirstClass<T> {...}
abstract class SecondClass<U> where U : FirstClass {...}
Это не работает, потому что FirstClass не определен. Поэтому мне нужно это сделать.
abstract class FirstClass<T> {...}
abstract class SecondClass<U, T> where U : FirstClass<T> {...}
Что работает. Тем не менее, это делает выполнение этих абстрактных классов уродливым.
class SomeClass {...}
class MyFirstClass : FirstClass<SomeClass> {...}
class MySecondClass : SecondClass<MyFirstClass, SomeClass> {...}
Это кажется излишним для меня, потому что я задаю SomeClass дважды. Есть ли способ объявить его таким образом, что T из FirstClass автоматически является U для SecondClass. Мне бы хотелось, чтобы это выглядело так.
class SomeClass {...}
class MyFirstClass : FirstClass<SomeClass> {...}
class MySecondClass : SecondClass<MyFirstClass> {...}
Хотя я сомневаюсь, что этот точный сценарий возможен, есть ли более чистая, что делать, что я пытаюсь сделать?
Изменить
Несколько человек предложили создать интерфейс IFirstClass. Но мои определения ближе к этому.
class FirstClass<T>
{
public T MyObj { get; set; }
}
class SecondClass<U, T> where U : FirstClass<T>
{
U MyFirstClass { get; set; }
}
С интерфейсом я не могу получить доступ к MyFirstClass.MyObj из SecondClass. Хотя я мог бы создать объект T MyObj {get; задавать; }
на IFirstClass, затем используйте new
, чтобы скрыть его, silverlight выдает подгонку в привязку, если я это сделаю.