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