statique de la classe abstraite
J'ai besoin d'un moyen de créer une classe statique où certaines constantes peuvent être spécifique à chaque cas, mais codé en dur.
Ce que je veux vraiment faire est d'avoir une classe où plusieurs constantes sont fournis lorsque la classe est étendue - je veux les constantes codée en dur. J'ai pensé que je vais faire de l'abstrait propriétés et définir le get { return constante; } lors de l'extension de la classe.
Je sais que c'est pas possible, alors maintenant, je suis confronté à deux options et je me demande ce qui serait le mieux et pourquoi (si il y a des options qui me manque, s'il vous plaît laissez-moi savoir!)
- Créer une classe statique avec nullable champs et de lever une exception si les champs sont nuls lorsque la méthode statique est appelé.
- Abandonner la classe statique. Non statique de la classe avec le résumé des propriétés et de créer une instance de l'objet partout où j'en ai besoin, même si toutes les fonctionnalités est vraiment statique.
Je sais que cela peut-être très subjectif et dépendant, mais je vais tourner en rond en pensant à cela et peut vraiment faire avec un peu d'intrants externes. Qu'en plus, je l'espère, il peut y avoir loin de faire ce que je veux et j'en suis juste à penser que c'est mal.
Mise à jour: Code: je vais essayer d'écrire un peu de code qui décrit ce que j'aimerais faire. Je sais que ce code ne peut pas marcher!
Imaginer que la classe abstraite de Calcul se trouve dans une dll, utilisé par de nombreux projets. La fonctionnalité est la même pour toutes, seulement la Constante varie d'un projet à.
public abstract static class Calculation
{
private abstract int Constant { get; } //The constant is unknown at this time
public static int Calculate(int inputValue)
{
return inputValue * Constant;
}
}
La classe Calc est définie dans un projet distinct, où la fonctionnalité est nécessaire et la Constante est connue.
public static class Calc : Calculation
{
private override int Constant { get { return 2; }
}
...
static class Program
{
[STAThread]
static void Main()
{
//At some point:
int result = Calc.Calculate(6);
}
}
Je suppose que le plus simple serait de créer un non-statique de la classe et de créer une instance, cependant j'ai peur d'avoir plusieurs instances de la classe pourrait être coûteux et voudrais éviter si possible.
Je ne vois pas comment je pourrais écrire cela comme un pattern singleton sans l'écrire à nouveau dans chaque projet ayant seulement la Imbriquée classe dans la dll. Qui n'empêche pas le réalisateur de créer une classe ordinaire et est susceptible de relancer le débat, pour chaque projet, d'où le code est utilisé.
Mise à jour #2 : Ce que je ment avec l'option est celui-ci:
Classe dans une dll:
public static class Calculation
{
public int? Constant {get; set;}
public static int Calculate(int inputValue)
{
if (Constant == null)
throw new ArgumentNullException();
return inputValue * (int)Constant;
}
}
Utilisation de la fonction dans un autre projet:
static class Program
{
[STAThread]
static void Main()
{
//At some point:
Calculation.Constant = 2;
int result = Calc.Calculate(6);
}
}
Option est très simple et élégant, ce qui me dérange à propos de ça que rien forces l'implémenteur de définir la Constante. J'ai peur d'un (certes peu probable) scénario où un coin obscur de cas sera la cause de la propriété de ne pas être ensemble et pour le code à l'échec (et de la Constante étant le dernier suspect)...
Vous ne pouvez pas prolonger (hériter) une classe statique, c'est quoi exactement votre scénario? Un petit morceau de code vaut 1000 mots.
Pouvez-vous décrire à l'aide de quelques exemples -- peut-être pas compilable -- code?
Je suis d'accord avec Joachim, l'utilisation d'un Singleton de la place. Si vous avez besoin d'aide avec Singleton, vérifiez Jon Skeet Singleton l'article.
Il n'y a aucun cas pour une classe statique ici (ou même un singleton de l'omi).
OriginalL'auteur David Božjak | 2011-09-13
Vous devez vous connecter pour publier un commentaire.
Vous pourriez faire de la non-classes statiques qui suivent singleton, en veillant à une seule instance de l'objet qui ait jamais existé. Je suppose que pourrait être la prochaine meilleure chose.
Commentaire de Anne Lagang: "Si vous avez besoin d'aide avec Singleton, vérifiez Jon Skeet Singleton l'article."
OriginalL'auteur Joachim VR
Vous ne pouvez pas voulez statique et de l'héritage dans le même temps ! Simplement, il ne faire sens !
Si vous avez besoin de redéfinir le comportement, vous avez besoin de l'héritage !
Si vous voulez la simplicité de l'appel (l'un des avantage de la statique), vous pouvez utiliser de l'Usine (ou d'un singleton si une seule instance est nécessaire)
Ma conjecture est que vous avez probablement à repenser votre modèle. Cet ensemble de constantes de la vôtre représentent probablement quelque chose que vous pourriez extraire dans une catégorie distincte ensuite passer cette classe à votre méthode statique. Serait-ce l'adapter à vos besoins ?
OriginalL'auteur VdesmedT
Modifier
À l'exemple de code:
Un peu plus général:
Première idée:
Le plus proche que je peux penser à est de génériques:
Ou si vous avez vraiment besoin un seul type statique
T-il m'aider?
Je pense que j'étais encore à modifier. Vérifier ma réponse maintenant. (vous pouvez utiliser
int?
où que je disint
si c'est plus approprié)le type réel ne serait pas int?. Il sera probablement byte[], le point que j'essayais de faire, c'est qu'il peut être nulle et que indiquera une erreur. L'option la plus générale avec le Contexte ne fonctionne pas pour moi. Merci de lire la ligne de fond de ma question pour savoir pourquoi je ne veux pas utiliser cette option.
l'utilisation d'un Contexte de classe au lieu de struct. Ne lui donnez pas de constructeur par défaut. Le Profit. Sinon: l'utilisation
ctx??DefaultContext
partout. Le Profit.OriginalL'auteur sehe
J'ai besoin d'à peu près la même chose, donc j'ai d'abord fait un non-statique de la classe avec toutes les fonctionnalités.
Ensuite, une classe statique qui instancie un tel non-statique de la classe dans son constructeur statique.
Alors tout de la statique des appels de méthodes respectives des méthodes d'instance.
Quelque chose comme ceci:
OriginalL'auteur Kostas