Возможно ли создать наследуемый класс из статического метода класса-предка? Есть ли возможность описать статический метод CreateFromBaseObject в классе MyBaseClass, чтобы при вызове этого метода из класса-потомка MyDerivedClass создавался экземпляр MyDerivedClass, но не использовался параметр U? (Конечно без реализации метода CreateFromBaseObject внутри MyDerivedClass)public abstract class MyBaseClass where T : class, new() { protected T RealObject = new T(); public void setRealObject(dynamic realObject) { this.RealObject = realObject; } public static U CreateFromBaseObject(T baseObject) where U : MyBaseClass, new() { var t = new U(); t.setRealObject(baseObject); return t; } } ... public class MyDerivedClass : MyBaseClass{...} ... RealDerivedClass realDerivedClass = new RealDerivedClass(); //Приходится так: MyDerivedClass myRealDerivedClass = MyDerivedClass.CreateFromBaseObject(realDerivedClass); //А хочется так: MyDerivedClass myRealDerivedClass = MyDerivedClass.CreateFromBaseObject(realDerivedClass);
Нет, нельзя создать наследуемый класс из статического метода класса-предка без указания параметра типа U. В данном случае параметр типа U необходим для указания конкретного типа класса-потомка, который будет создан в статическом методе CreateFromBaseObject.
Если вы хотите избежать указания типа U при вызове метода CreateFromBaseObject из класса-потомка, вам придется создать отдельный метод в классе-потомке, который будет делегировать вызов статического метода из класса-предка и уже внутри определять тип класса-потомка. Например:
public class MyDerivedClass : MyBaseClass<RealDerivedClass> { public static MyDerivedClass CreateFromBaseObject(RealDerivedClass baseObject) { return CreateFromBaseObject<MyDerivedClass>(baseObject); } }
Таким образом, при вызове метода CreateFromBaseObject из класса MyDerivedClass необходимо будет указать только объект baseObject, а тип класса-потомка будет определен внутри метода CreateFromBaseObject класса-потомка.
Нет, нельзя создать наследуемый класс из статического метода класса-предка без указания параметра типа U. В данном случае параметр типа U необходим для указания конкретного типа класса-потомка, который будет создан в статическом методе CreateFromBaseObject.
Если вы хотите избежать указания типа U при вызове метода CreateFromBaseObject из класса-потомка, вам придется создать отдельный метод в классе-потомке, который будет делегировать вызов статического метода из класса-предка и уже внутри определять тип класса-потомка. Например:
public class MyDerivedClass : MyBaseClass<RealDerivedClass>{
public static MyDerivedClass CreateFromBaseObject(RealDerivedClass baseObject)
{
return CreateFromBaseObject<MyDerivedClass>(baseObject);
}
}
Таким образом, при вызове метода CreateFromBaseObject из класса MyDerivedClass необходимо будет указать только объект baseObject, а тип класса-потомка будет определен внутри метода CreateFromBaseObject класса-потомка.