2017-08-15 4 views
-5

Hier ist sie:Aufruf einer implementierten Funktion der Kinder Instanz von abstrakten übergeordneten Klasse in C#

abstract class IA 
{ 
    public virtual void ChangePropertyOfAIChild() 
    { 
    b.value = true; 
    } 
} 
... 
class B:IA 
{ 
    bool value; 

} 

class C:IA 
{ 
    bool value; 
} 
.... 
///main 
IA newBInstance = new B(); 
newBInstance.ChangePropertyOfAIChild(); 

IA newCInstance = new C(); 
newCInstance .ChangePropertyOfAIChild(); 

///// 

Was für eine richtige Art und Weise der calliing eine bereits implememnted Funktion in einem Kinder Klasse von der Basis abstrakte Klasse sein würde und sich verändernden dessen Wert? Danke!

+1

Wenn B ein Kind von A ist, wie würde A wissen, dass B existiert (oder sich sogar darum kümmert)? Deine Hierarchie ist rückwärts –

+0

Fehle ich hier etwas? Dieser Code wird nicht einmal kompiliert. Wie werden Sie auf eine Eigenschaft von etwas zugreifen, das nicht einmal existiert? – Sach

Antwort

1

Wie @Camilo Terevinto darauf hingewiesen hat, ist Ihre Hierarchie falsch. versuchen:

public abstract class IA 
{ 
    public bool value; 

    public virtual void ChangePropertyOfAIChild() 
    { 
    value = true; 
    } 
} 

public class B : IA 
{ } 

public class C : IA 
{ } 

// in main 
IA newBInstance = new B(); 
newBInstance.ChangePropertyOfAIChild(); 

IA newCInstance = new C(); 
newCInstance.ChangePropertyOfAIChild(); 
/// 

Ihr Beispielcode hatte die Basis abstrakte Klasse versuchen, den Wert eines Feldes in einer Klasse ändern es nicht kennt:

(B.Wert = true)

Damit die Basisklasse dies tun kann, muss das Feld innerhalb der Basisklasse deklariert werden.

+0

Sie haben absolut Recht. Vielen Dank! –

1

Ich glaube, du hast dein Erbe nicht richtig verstanden.

Wenn dies Ihre Klassenimplementierung:

public abstract class IA 
{ 
} 

public class B : IA 
{ 
    public bool value; 
} 

public class C : IA 
{ 
    public bool value; 
} 

Und dann, wenn Sie eine Instanz von IA wie so erstellen:

IA newBInstance = new B(); 

Dann Compiler geht voran und erstellt eine Instanz IA. Da Ihre IA KEINE Eigenschaft namens value hat, können Sie nicht darauf zugreifen.

Sie haben zwei Möglichkeiten, entweder die von CodexNZ in der vorherigen Antwort vorgeschlagene Methode zu verwenden oder einfach newInstance an B zu senden und value direkt festzulegen. Wie folgt aus:

IA newBInstance = new B(); 
((B)newBInstance).value = true; 

Dies ist jedoch unlogisch, da, wenn Sie tun können, dass Sie könnte genauso gut eine Instanz von B in erster Linie erstellen. Also ich empfehle die vorherige Methode. Das ist mehr zu erklären warum Ihre Logik funktioniert nicht.

Bitte beachten Sie ein Tutorial like this, um mehr zu erfahren. Es gibt Tonnen von mehr Ressourcen im Internet.

Verwandte Themen