J'ai la conception de classe abstraite suivante, je me demandais si quelqu'un peut suggérer des améliorations en termes de renforcement de l'application de nos exigences ou en simplifiant l'implémentation de la ControllerBase.Améliorer cette classe abstraite générique
//Dependency Provider base
public abstract class ControllerBase<TContract, TType> where TType : TContract, class
{
public static TContract Instance
{
get {
return ComponentFactory.GetComponent<TContract, TType>();
}
}
public TContract GetComponent<TContract, TType>() where TType : TContract, class
{
component = (TType)Activator.CreateInstance(typeof(TType), true);
RegisterComponentInstance<TContract>(component);
}
}
//Contract
public interface IController
{
void DoThing();
}
//Actual Class Logic
public class Controller: ControllerBase<IController,Controller>
{
public void DoThing();
//internal constructor
internal Controller(){}
}
//Usage
public static void Main()
{
Controller.Instance.DoThing();
}
Les faits suivants doivent toujours être vrai,
TType
doit toujours mettre en œuvreTContract
(Enforced utilisant une contrainte générique)TContract
doit être une interface (Vous ne trouvez pas un manière de l'appliquer)TType
ne devrait pas avoir de constructeur public, seulement un constructeur interne, y a-t-il un moyen d'appliquer cela en utilisantControllerBase
?TType
doit être une classe concrète (N'a pas d'éléments nouveaux() comme générique Contraindre étant donné que les constructeurs devraient être marqués comme interne)
L'exécution de TContract en tant qu'interface semble être un non-sens. Ne vous méprenez pas, mais les interfaces ne peuvent pas être instanciées. Comprenez-les comme de simples contrats, rien de plus, ils n'appliquent (principalement) que des comportements. Mais ce ne sont pas des types, ni des classes. Vous devriez essayer d'expliquer pourquoi vous voulez que ce soit l'interface. –
Désolé, je ne sais pas pourquoi j'ai dit interface, je voulais dire classe abstraite –
Voulez-vous expliquer pourquoi cela ne fonctionnerait pas? –