66 votes

Pourquoi ne puis-je pas déclarer les méthodes C # virtuelles et statiques?

J'ai une classe helper qui est juste un tas de méthodes statiques et souhaitez sous-classe de la classe d'aide. Certains comportement est unique, selon la sous-classe donc je voudrais appeler une méthode virtuelle de la classe de base, mais étant donné que toutes les méthodes sont statiques, je ne peux pas créer une plaine de méthode virtuelle (besoin d'un objet de référence pour l'accès de méthode virtuelle).

Est-il un moyen de contourner cela? Je suppose que je pourrais utiliser un singleton.. HelperClass.Exemple.HelperMethod() n'est pas tellement pire que HelperClass.HelperMethod(). De bons points pour n'importe qui qui peut souligner certaines langues qui virtuel de soutien de méthodes statiques.

Edit: OK ouais je suis fou. Les résultats de recherche Google m'a fait penser que je n'étais pas un peu là.

47voto

SeeR Points 1017

Je ne pense pas que tu sois fou. Vous voulez simplement utiliser ce qui est actuellement impossible dans .NET.

Votre demande de méthode statique virtuelle aurait tellement de sens si nous parlons de génériques. Par exemple, ma future demande pour les concepteurs CLR est de me permettre d'écrire des interfaces comme ceci:

 public interface ISumable<T>
{
  static T Add(T left, T right);
}
 

et utilisez-le comme ceci:

 public T Aggregate<T>(T left, T right) where T : ISumable<T>
{
  return T.Add(left, right);
}
 

Mais c'est impossible en ce moment, donc je le fais comme ceci:

     public static class Static<T> where T : new()
    {
      public static Value = new T();
    }

    public interface ISumable<T>
    {
      T Add(T left, T right);
    }

    public T Aggregate<T>(T left, T right) where T : ISumable<T>, new()
    {
      return Static<T>.Value.Add(left, right);
    }
 

34voto

Chris Marasti-Georg Points 17023

Virtuel méthodes statiques ne faites pas de sens. Si je l'appelle, HelperClass.HelperMethod();, pourquoi aurais-je attendre quelques aléatoire sous-classe de la méthode d'être appelé? La solution se décompose quand vous avez 2 sous-classes de HelperClass - qui voulez-vous utiliser?

Si vous voulez avoir remplacable statique-type de méthodes que vous devez sans doute aller avec:

  • Un singleton, si vous voulez la même sous-classe pour être utilisé à l'échelle mondiale.
  • Une tradition hiérarchie de classe, avec une usine ou de l'injection de dépendance, si vous voulez des comportements différents dans les différentes parties de votre application.

Choisissez la solution a plus de sens dans votre situation.

16voto

Alan Points 3381

En effet, cela peut être fait dans Delphi. Un exemple:

 type
  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
  end;

  TTestClass = class
  public
    class procedure TestMethod(); virtual;
  end;

  TTestDerivedClass = class(TTestClass)
  public
    class procedure TestMethod(); override;
  end;

  TTestMetaClass = class of TTestClass;

var
  Form1: TForm1;

implementation

{$R *.dfm}

class procedure TTestClass.TestMethod();
begin
  Application.MessageBox('base', 'Message');
end;

class procedure TTestDerivedClass.TestMethod();
begin
  Application.MessageBox('descendant', 'Message');
end;


procedure TForm1.FormShow(Sender: TObject);
var
  sample: TTestMetaClass;
begin
  sample := TTestClass;
  sample.TestMethod;
  sample := TTestDerivedClass;
  sample.TestMethod;
end;
 

Plutôt interessant. Je n'utilise plus Delphi, mais je me souviens avoir été en mesure de créer très facilement différents types de contrôles sur un canevas de concepteur personnalisé en utilisant la fonction de métaclasse: la classe de contrôle, par exemple. TButton, TTextBox etc. était un paramètre, et je pouvais appeler le constructeur approprié en utilisant l'argument de la métaclasse réelle.

Type de modèle d'usine du pauvre homme :)

7voto

Peter Parker Points 13770

une méthode statique existe en dehors d'une instance d'une classe. Il ne peut utiliser aucune donnée non statique.

une méthode virtuelle sera "écrasée" par une fonction surchargée selon le type d'une instance.

vous avez donc une contradiction claire entre statique et virtuel.

Ce n'est pas un problème de support, c'est un concept. Je doute donc que vous trouverez un langage OOP qui prend en charge les méthodes statiques virtuelles.

7voto

Alex Weinstein Points 5839

Tu n'es pas fou. Ce à quoi vous faites référence est appelé liaison statique tardive; il a été récemment ajouté à PHP. Il y a un excellent fil qui le décrit - ici: http://stackoverflow.com/questions/87192/when-would-you-need-to-use-late-static-binding#87351

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X