Announcement

Collapse
No announcement yet.

Objekt inizialisieren mit nicht allen Methoden der Basisklasse

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Objekt inizialisieren mit nicht allen Methoden der Basisklasse

    Guten Tag miteinander

    Bin gerade an meiner Projektarbeit und versuche, Objekte aus einer Basisklasse zu erstellen, welche jedoch nicht ale Methoden der Basisklasse haben sollen.

    Dies ist dafür gedacht, dass in einer State-Machine für jeden Step ein Operator zu verfügung steht. Dieser Operator soll dem Webentwickler, jedoch nur die Funktionen anbieten, welche für diesen Step konfiguriert wurden.

    Weiss eventuell irgend jemand einen Ansatz, wie es möglich ist, aus einer Klasse mit z.B.: 30 public Methoden ein objekt zu erzeugen mit nur 20 von den 30 Methoden?

  • #2
    20 Methoden private deklarieren
    Christian

    Comment


    • #3
      sie müssen aber public sein, damit darauf zugegriffen weden kann, jedoch darf nicht jedes Objekt alle Methoden besitzen

      Comment


      • #4
        Wo ist da die Logik? Das abgeleitete Objekt soll Die Methode nicht haben, aber darauf zugreifen?
        Christian

        Comment


        • #5
          also ich habe ein Klasse welche die Methoden:

          public void createOrder(String pName)
          public void editOrder(String pChangeName, int pID)
          public void delOrder(int pID)
          public void createUser(String pNameofUser)
          .....

          besitzt

          nun möchte ich für den 1. Step in der Pipeline ein Objekt erstellen aus dieser Klasse welche nur die Methode
          public void createOrder(String pName)
          public void editOrder(String pChangeName, int pID)
          kennt. Damit der Webentwickler es einfacher hat, weil er nur die Funktionen sieht, welche er in diesem Step verwenden darf

          Comment


          • #6
            Ich weiss nicht was ein Step ist und ich kann mir auch keine Umgebung vorstellen, in dem die Klasse A einmal 3 und (wann eigentlich ändert sich die Umgebung) dann mal 30 Methoden hat.

            Das wird wohl auch den Entwickler irritieren, den man erwartet nicht, das sich die Funktionalität einer Klasse ändert.

            Du hast public, private, protected als Modifizierer.
            Du kannst ggf. deine Basisklasse splitten und auf unterschiedliche Klasse aufteilen, von der dann die Objekte erben.
            Christian

            Comment


            • #7
              Das macht keinen Sinn. Man könnte einfach auf die Basisklasse casten und dann wären alle Methoden wieder sichtbar. Sichtbarkeit reduzieren wiederspricht also jedem OO-Konzept.


              Wenn du es jemanden einfacher machen willst dann verpasse deiner Klasse verschieden Interface mit einem sinnvollen Zuschnitt der Methoden und liefere dem anwendenden Entwickler über die Methoden über die er sich eine Instanz deiner Klasse besorgt eben diese nur diesen Interface Typ. Wenn er sich dann denn Typ auf was anderes zurecht castet ist er selbst Schuld.

              Comment


              • #8
                ok, dann werde ich es in mehrere Klassen aufteilen. Dachte villeicht gibt es eine Möglichkeit es dynamisch zur Laufzeit zu erzeugen. Also eine Klasse dynamisch zu erzeugen, welche auf einer Grundklasse basiert und dadurch nicht alle Methoden besitzt.

                Comment


                • #9
                  Hallo,

                  ok, dann werde ich es in mehrere Klassen aufteilen.
                  Nicht Klassen sondern Schnittstellen.

                  [highlight=c#]
                  public interface IStep1 {...}
                  public interface IStep2 {...}
                  public interface IStep3 {...}

                  public class SuperKlasseDieVollSoCWiderspricht : IStep1, IStep2, IStep3
                  {
                  public IStep1 createOrder(String name) { ....; return this; }
                  ....
                  }
                  [/highlight]
                  Schau dir in diesem Zusammenhang auch Fluent-Interfaces an.

                  Die Klasse gehört dennoch in mehrere aufgeteilt. Über das Fluent-Interface leidet der Benutzer dieses "Verbands" an keinerlei Komforteinbußen.


                  mfG Gü
                  Zuletzt editiert von gfoidl; 05.07.2011, 23:11. Reason: pName ersetzt durch name - "falsches" runterkopiert
                  "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                  Comment


                  • #10
                    Code:
                    public void createOrder(String pName)
                    public void editOrder(String pChangeName, int pID)
                    public void delOrder(int pID)
                    public void createUser(String pNameofUser)
                    Heutzutage brauchst Du auch kein p mehr vor die Parameter schreiben. Das kommt noch aus Zeiten wo es keine intelligenten IDEs gab. Schreib dafür lieber die Namen Deiner Funktionen aus.
                    Hier sind ausserdem mindestens 2 Concerns vermischt. Einen User anlegen hat nichts in der Klasse verloren die irgendwelche Orders anlegt oder löscht.e
                    Vielleicht auch mal ein wenig Richtung Design Patterns lesen. Gerade wenn Sachen zum Zusammensetzen gedacht sind finden sich da sehr gute Lösungen. Ausserdem IMMER:

                    Composition OVER Inheritance!

                    Comment

                    Working...
                    X