1. #1
    Avatar von The Dope Show
    Registriert seit
    16.12.2013
    Beiträge
    111
    Thanked 193 Times in 24 Posts

    Standard Abstraktes UND statisches Attribut?!

    Hey,

    ich habe mehrere Klassen die von einer Basisklasse erben. Jede Klasse soll einen String mit dem Namen haben. Das könnte ich nun ja ganz simple mit einem Attribute machen:


    abstract class BaseClass
    {
    public abstract string Name
    {
    get;
    }
    }

    class Example : BaseClass
    {
    public override string Name
    {
    get
    {
    return "Test";
    }
    }
    }

    In meinem Programm erzeuge ich dann ein Array und durchlaufe es mit einer Schleife

    List<BaseClass> myList = new List<BaseClass>();
    myList.Add(new Example());
    myList.Add(new Example2());
    ...
    foreach (BaseClass item in myList)
    {
    MessageBox.Show(item.Name);
    }

    Das finde ich aber Leistungsverschwendung, weil es so ist: Ich brauche nur eine Instanz der Klassen, man soll aber anhand der Namen wählen können welche davon genutzt wird. Ich brauche also ein statisches Attribut damit ich keine unnötige Instanz erzeugen muss und brauche einen Array der Klassen annimmt ohne dass ich ein Objekt aus ihnen erzeugt habe.

    Es fängt schon beim ersten an: Anscheinend kann man keine abstrakten Klassen mit statischen Attributen erzeugen! Verstehe ich absolut nicht wieso das nicht mögich sein soll. Es wird zwar kein Objekt erzeugt aber wieso kann ich nicht ein Muster festlegen, welche Attribute/Methoden eine Klasse haben muss, die kein Objekt ist?

    Um es mal Code zu zeigen, genau das suche ich, funktioniert aber so nicht:


    abstract class BaseClass
    {
    public abstract static string Name
    {
    get;
    }
    }

    class Example : BaseClass
    {
    public override static string Name
    {
    get
    {
    return "Test";
    }
    }
    }

    Meine Vermutung ist, dass Vererbung immer an ein Objekt gebunden ist => Wo kein Objekt ist kann man also nichts vererben, anders macht das für mich keinen Sinn. Nur welchen Weg gibt es eine Klasse dazu zu zwingen, ein statisches Attribut zu besitzen? Das muss doch irgendwie gehen? -.-

  2. #2
    Avatar von Nuebel
    Registriert seit
    23.11.2013
    Beiträge
    446
    Thanked 361 Times in 236 Posts

    Standard AW: Abstraktes UND statisches Attribut?!

    abstract und static schließen sich gegenseitig aus.

    Wenn die einzige Aufgabe deiner BaseClass darin besteht, den abgeleiteten Klassen ein Name-Attribut anzudrehen, wäre ein Interface vorzuziehen.
    Dein Problem, sofern ich es richtig verstanden habe, ließe sich durch Einsatz von Erzeugungsmuster lösen; schau dir für den Anfang die sogenannte Fabrikmethode an.

  3. #3
    Avatar von The Dope Show
    Registriert seit
    16.12.2013
    Beiträge
    111
    Thanked 193 Times in 24 Posts

    Standard AW: Abstraktes UND statisches Attribut?!

    Sorry habe vergessen dazuzusagen, dass die Basisklasse nicht rein abstrakt ist sondern auch Methoden (also Logik) enthält, die von allen erbenden Klassen geteilt werden.
    Also so etwas:

    abstract class BaseClass
    {
    public abstract static string Name
    {
    get;
    }

    public void DoSomething()
    {
    // ...
    }
    }

    Mit einem Interface geht das ja soweit ich weiß nicht da dies lediglich das reine Muster vorgibt, also keinerlei Code enthalten darf.
    Ist es möglich das irgendwie zu realisieren, ohne dass ich DoSomething() in eine Hilfsklasse auslagern muss, sodass ich auf ein Interface umsteigen kann?

  4. #4
    Avatar von Nuebel
    Registriert seit
    23.11.2013
    Beiträge
    446
    Thanked 361 Times in 236 Posts

    Standard AW: Abstraktes UND statisches Attribut?!

    Gut, wenn sie Logik enthält, hat die abstrakte Basisklasse durchaus ihre Daseinsberechtigung.

    Hast du dir die Fabrikmethode angeschaut, und wenn ja, käme es für dich in Betracht?
    Im Prinzip ist es sowas:
    Code:
    (in der BaseClass)
    static BaseClass createByName(string name) {
      if (name == "bla") return new X();
      else if (name == "blaA") return new Y();
      else return new Z();
    }

Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.