Bei einer abstrakten Klasse hast du die Möglichkeit eine Defaultimplementierung anzubieten. Bei einem Interface sagst du wirklich nur du hast Methode XY mit den Parameter abc von den Typen kij und dem Rückgabe wert v. Zudem kann man bei einem Interface auch keine Attribute angeben, wenn ich mich jetzt nicht Irre.
Weiterer Unterschied ist, dass Klassen nachher mehrere Interfaces implementieren können, aber immer von maximal einer (abstrakten) Klasse erben können.
Das man eine default-Implementierung vornehmen kann, war mir nicht bewusst, aber wäre es dann nicht sinnvoller einfach eine normale Klasse zunehmen, und die Methoden einfach virtuell zu kennzeichnen?
Was würde bei folgendem Szenario passieren? Wie sähe hier die Implementierung aus? Soviel ich weiß, ist eine Methoden-Überladung nur durch unterschiedliche Signaturen, welche den Rückgabetyp nicht berücksichtigt, gültig. Würde es hierbei zu einem Konflikt kommen und ich müsste auf ein Interface (ITest1 / ITest2) verzichten?
Code:
interface ITest1
{
int foo(int a, int b);
}
interface ITest2
{
void foo(int a, int b)
}
public sealed class CFoo : ITest1, ITest2
{
//........
}
Achja, bevor ich es vergesse: Sind alle Methoden, Eigenschaften und Felder automatisch statisch, wenn ich die Klasse mit dem static Modifizierer bestücke?
Kannst glaube ich eine für beide Implementieren, oder für beide einzeln, indem du den Interfacenamen davor schreibst, da bin ich mir gerade nicht ganz sicher, sollte aber gehen.
Bei einer abstrakten Klassen kannst du auch kein Objekt direkt erzeugen, sondern nur von erbenden Klassen.
Das ist premature optimization. Nimm das was lesbarer ist.
Quote:
Originally Posted by Logtetsch
Das man eine default-Implementierung vornehmen kann, war mir nicht bewusst, aber wäre es dann nicht sinnvoller einfach eine normale Klasse zunehmen, und die Methoden einfach virtuell zu kennzeichnen?
Was würde bei folgendem Szenario passieren? Wie sähe hier die Implementierung aus? Soviel ich weiß, ist eine Methoden-Überladung nur durch unterschiedliche Signaturen, welche den Rückgabetyp nicht berücksichtigt, gültig. Würde es hierbei zu einem Konflikt kommen und ich müsste auf ein Interface (ITest1 / ITest2) verzichten?
Code:
interface ITest1
{
int foo(int a, int b);
}
interface ITest2
{
void foo(int a, int b)
}
public sealed class CFoo : ITest1, ITest2
{
//........
}
Achja, bevor ich es vergesse: Sind alle Methoden, Eigenschaften und Felder automatisch statisch, wenn ich die Klasse mit dem static Modifizierer bestücke?
Wenn mehrere Interfaces die gleichen Methoden haben, ist das kein Problem. Es ist letztendlich nur ein Vertrag, der besagt, dass diese Methode vorhanden sein muss (Interfaces zu implementieren ist nicht dasselbe wie von einer abstrakten Klasse zu erben!). Wenn zwei Verträge die Methode fordern, erfüllst du trotzdem beide, auch wenn du die Methode nur einmal hast.
Bei Mehrfachvererbung wäre das nicht so einfach, aber die unterstützt C# ja nicht.
Wenn es übrigens keinen Grund für eine abstrakte Klasse oder überhaupt Vererbung gibt, ist ein Interface vorzuziehen. Kompositionen sind flexibler als Vererbung.
sealed solltest du übrigens ebenfalls nur verwenden, wenn du auch einen guten Grund dazu hast.
Nein,statische Klassen machen nicht automatisch alles statisch. Du musst die Sachen selbst als statisch deklarieren.
p.s.
Optimal, wenn du dir solche Fragen stellst wie "Was ist wenn". Probieren geht über Studieren.
Würde mich gerne für mein Informatikstudium vorbereiten. WS fängt erst in 2 Monaten an. Was würdet ihr vorschlagen? Programmiergrundkenntnisse kenne ich natürlich schon. Java und C# kann ich teilweise. Sollte ich eine der beiden, ich sag mal auf einem profi level können?
Würde mich gerne für mein Informatikstudium vorbereiten. WS fängt erst in 2 Monaten an. Was würdet ihr vorschlagen? Programmiergrundkenntnisse kenne ich natürlich schon. Java und C# kann ich teilweise. Sollte ich eine der beiden, ich sag mal auf einem profi level können?
Im Studium gibt es genug Leute die selbst nicht oder kaum programmieren können (bei mir waren es etwa 1/3 aller Info Studenten) Programmieren zu können ist hilfreich, aber auf "profi level" musst du es auf keinen Fall können. Und letztlich so viel Programmieren kommt auch nicht dran, eigentlich musst du nur Pseudocode lesen können (außer in modulen wie Programmierung etc). Ich würde eher wenn die Uni so etwas anbietet eine Mathe Vorkurs besuchen, und generell deine Mathekentnisse aufbereiten.
CO 2 Chit-Chat 04/04/2013 - Conquer Online 2 - 3 Replies Hello,
You are allowed to talk in this thread about all things belonging to CO2.
It does not matter whether you want to ask something or you just want to talk about CO2.
Posts like "lol" are forbidden!