Mehrere abgeleitete abstrakte Klassen?
Muss ich schaffen, ein Kurs-Management-System mit Kurs-Kategorien:
Cooking, sewing and writing courses
cooking
und writing
haben jeweils 2 Kurse (Italienisch, Meeresfrüchte, kreativ-schreiben-und business-schreiben). Dies schafft abgeleitet abstract:
abstract course -> abstract cooking -> concrete seafood
Den abstrakten Kochen und schreiben haben gemeinsame Felder und einige gemeinsame Methoden, aber Sie haben auch abstrakte Methoden, die Abstrakt in der Basisklasse.
Kann das in C#? Wenn ich die abgeleiteten abstrakten Klasse abstrakte Methoden von Visual Studio sagt, Sie verstecken die Basisklasse Abstrakt und dann die konkrete Klasse Methoden haben Fehler zu sagen, die Basis-Klasse muss Abstrakt sein (ist es aber müssen sich nicht registrieren). Ich habe nach einer Antwort suchen. Ich weiß, einfacher Vererbung ist in C# aber die Vererbung trägt unten in der Kette. Was ist die beste Antwort?
Hier ist ein code-snippet - ich hoffe, es verdeutlicht das problem:
public abstract class Course
{
public abstract void AddStudent(StudentName sn, int f);
public abstract decimal CalculateIncome();
}
public abstract class WritingCourse : Course
{
public void AddStudent(StudentName sn, int f)
{
//Add student
}
public abstract decimal CalculateIncome(); //can only be claculated in concrete
}
public class BusinessWritCourse : WritingCourse
{
public void AddStudent(StudentName sn, int f):
base(sn, false){}
public decimal CalculateIncome()
{
return //do stuff
}
}
public class SewingCourse : Course
{
public override void AddStudent(StudentName sn, int f)
{
//do stuff
}
public override decimal CalculateIncome()
{
return //do stuff
}
}
- Kannst du Beispiel-code, der mit den Problemen bist du begegnet?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie base class 'A', die eine abstrakte Methode 'b()' dann brauchen Sie sich nicht zu erklären, 'b()' erneut als abstract in B : A, C : B überschreiben, benutzen Sie es einfach nicht. Auch wenn Sie das überschreiben der 'b()' Methode in Klasse B können Sie wieder überschreiben Sie in der Klasse 'c()' (und sogar die base.(); ausführen B Umsetzung.
Code:
Ebenfalls zu klären: Methoden als Abstrakt deklariert werden muss überschrieben (wie in einer Oberfläche, und nur durch das direkte Kind der Klasse deklarieren die abstrakte Methode). Methoden als virtual deklariert überschrieben werden können, aber nicht müssen.
Ich denke, diese Art von Probleme besser zu lösen, mit Schnittstellen und nicht abstrakte Klassen:
Ex:
Wenn ich das richtig verstehe, ich denke, Sie würde wollen, verwenden Sie die 'virtuelle' Schlüsselwort auf abstrakten Methoden, die Sie überschreiben möchten?
Wenn du redest über die Fehler, die etwas sagt wie "- Methode blendet geerbt Mitglied, fügen Sie das new-Schlüsselwort, wenn das verstecken war bestimmt", dann auf der virtuellen Basis-Methode und setzen auf die Erben-Methode tun: