2017-05-26 2 views
0

J'écris une application C# qui générera des Donjons & Dragons en vrac. Cependant quand j'ai rencontré le concept d'un "bonus" à un paramètre de caractère, j'ai couru le visage d'abord dans un mur. Des types génériques correctement contraignants pour la méthode du bonus m'échappent. Voici un exemple de ce que j'ai:Implémentation de la contrainte de type pour une classe C# non associée

public interface IAbilityScore : IBaseEntity 
{ 
    string Name { get; set; } 
} 

public interface IBonus<T,K> where T : IBonusable<K> 
{ 
    K Value { get; set; } 
} 

public interface IBonusable<T> 
{ 
    T Value { get; set; } 
} 

public interface ICharacterAbilityScore : IBaseEntity, IBonusable<int> 
{ 
    ICharacter Character { get; set; } 
    IAbilityScore AbilityScore { get; set; } 
    bool IsSaveProficient { get; set; } 
} 

Le problème est que je fais face à un point de vue utilisateur, je veux que l'utilisateur soit en mesure d'ajouter « Cette course donne un bonus de +2 à l'Intelligence ». Malheureusement, le score de capacité "Intelligence" n'aura pas de propriété Value tant qu'il n'est pas associé à un caractère, ce qui pose un problème à la contrainte IBonusable. J'aimerais pouvoir contraindre la propriété value de l'IBonus au même type que la propriété value de l'item IBonusable sans avoir à lier le bonus directement à un caractère spécifique (ce qui arriverait dans ma précédente implémentation, avec ICharacterAbilityScore héritant IBonusable).

Existe-t-il une méthode d'interface uniquement pour accomplir cela, ou devrais-je ajouter cette contrainte lorsque je définis les implémentations concrètes?

Aussi, je prévois d'utiliser d'abord le code EF pour construire la base de données, si cela affecte la réponse.

Répondre

0

Je ne sais pas si j'ai bien compris votre question, mais si je comprends bien.

public interface IAbilityScore : IBaseEntity 
{ 
    string Name { get; set; } 
} 

public interface IBonus<T> 
{ 
    T Value { get; set; } 
} 

public interface IBonusable<T> 
{ 
    T Value { get; set; } 
} 

public interface ICharacterAbilityScore<T> : IBaseEntity, IBonusable<T>,IBonus<T> 
{ 
    ICharacter Character { get; set; } 
    IAbilityScore AbilityScore { get; set; } 
    bool IsSaveProficient { get; set; } 
}