2010-01-08 9 views
1

Je veux créer une classe qui ne peut qu'être héritée, pour cela je sais qu'elle devrait être abstraite. Mais maintenant le problème est que je veux utiliser les fonctions de cette classe sans les rendre statiques. Comment puis je faire ça.Comment accéder aux fonctions de la classe abstraite sans les rendre statiques?

public abstract Class A 
{ 
A() 
{} 
public void display() 
{} 
} 

public Class B:A 
{ 
base.A() // this is accessible 
this.display() // this is not accessible if i dont make this function static above 
} 
+0

Pouvez-vous comment vous aimeriez * utiliser * ces méthodes (même si elle ne le fait pas? compiler)? Je ne suis pas sûr de comprendre ... –

+1

De l'exemple que vous avez fourni, il n'est pas clair dans quel contexte essayez-vous d'appeler la méthode 'display'. Est-ce dans une méthode statique en classe B? Est-ce un initialiseur de champ statique? –

Répondre

2

Votre exemple ne compile pas, vous pourriez envisager quelque chose comme ceci:

using System; 

public abstract class A 
{ 
    protected A() 
    { 
     Console.WriteLine("Constructor A() called"); 
    } 
    public void Display() 
    { 
     Console.WriteLine("A.Display() called"); 
    } 
} 

public class B:A 
{ 
    public void UseDisplay() 
    { 
     Display(); 
    } 
} 

public class Program 
{ 
    static void Main() 
    { 
     B b = new B(); 
     b.UseDisplay(); 
     Console.ReadLine(); 
    } 
} 

Sortie:

Constructor A() called 
A.Display() called 

Note: Création d'un nouveau B () appelle implicitement A(); Je devais rendre le constructeur de A protégé pour éviter cette erreur: "'AA()' est inaccessible en raison de son niveau de protection"

0

Voilà comment vous pouvez le faire ..

public abstract class A 
{ 
    public virtual void display() { } 
} 

public class B : A 
{ 
    public override void display() 
    { 
     base.display(); 
    } 

    public void someothermethod() 
    { 
     this.display(); 
    } 
} 
+2

vous devez rendre l'affichage virtuel. aussi, pourquoi a-t-il besoin de la dérogation du tout? –

+0

Je ne veux pas remplacer l'affichage. Est-ce qu'il y a une autre méthode? C'est mon premier programme OO que j'essaie de mettre en œuvre. Je sais seulement que je ne peux pas rendre la fonction d'affichage statique selon les exigences de mon projet. Propose-moi le meilleur chemin possible. Je peux rendre la classe A non abstraite ou quelque chose mais peut rendre les fonctions des membres statiques. –

2

Ce n'est pas vrai. Vous n'êtes pas obligé de rendre Display() static; vous pouvez l'appeler librement de la sous-classe. D'un autre côté, vous ne pouvez pas appeler le constructeur comme ça. Peut-être que c'est juste une erreur dans l'exemple, mais le vrai problème avec le code que vous avez est que vous ne pouvez pas mettre des appels de méthode au milieu de votre définition de classe.

Essayez ceci:

public abstract class A 
{ 
public void Display(){} 
} 

public class B:A 
{ 
public void SomethingThatCallsDisplay() 
{ 
    Display(); 
} 
} 
+0

ne considère pas la syntaxe, car il peut être peu effrayant ici, mais que je vais le rendre correct. Faites-moi savoir sur la solution uniquement liée à OO comme je suis nouveau à OO –

+0

@icambron cela signifie-t-il que l'affichage aura toujours une seule copie? –

+1

Votre OO est bon pour commencer. Il n'y a aucune raison de rendre statique Display(). La question doit donc être plus subtile, et vous devrez nous donner plus d'informations. Je ne sais pas ce que vous entendez par une seule copie dans le contexte de l'affichage. Pouvez-vous être plus précis? –