none
Klassen erstellen RRS feed

  • Frage

  • Hallo zusammen

    Angenommen, ich möchte eine Klasse erstellen, die mir über eine Factory-Methode einmal Instanzen liefert deren Eigenschaften readonly sind und eine zweite Factory-Methode, die mir Instanzen mit read/write-Eigenschaften liefert.

    Also vom Konzept her in etwa so, als würde die Klasse einmal mit der RW-Direktive und einmal ohne erstellt.

    #define RW
    //#undef RW
    public class Shuttle {
      private int myVar;
      public int MyProperty {
        get {
          return myVar;
        }
    #if RW
        set {
          myVar = value;
        }
    #endif
      }
    }

    Wäre die Beschäftigung mit der TypeBuilder-Klasse / System.Reflection.Emit-Namespace hier der richtige Ansatz?

    Ist das grundsätzlich überhaupt irgendwie umsetzbar?

    Herzlichen Dank

    Gruß, Klaus




    Samstag, 9. Januar 2016 19:52

Antworten

  • Hallo Klaus,

    ob eine Klasse einen Setter hat oder nicht lässt sich nur zur Compile-Zeit bestimmen. Im nachhinein geht das nicht mehr. Wenn das zurück gegebene Objekt immer den selben Typ haben soll, so haben auch entweder alle oder keines einen Setter für die Eigenschaft.

    Eine Möglichkeit besteht darin die Klasse erst zur Laufzeit zu kompilieren und dann dynamisch zu bestimmen ob die Setter mit enthalten sein sollen. Ohne weitere Hintergründe bezweifle ich aber dass sich das lohnt.

    Möglich wäre ebenfalls eine Exception auszulösen, sobald man versucht einen Wert zu setzen. Das könntest du über eine Zusätzliche Eigenschaft in der Klasse bestimmen, welche du ggf. auf true/false setzt. Damit ist zwar ds Zuweisen erstmal möglich, aber die weitere Ausführung des Programms nicht.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert K. Pater Dienstag, 12. Januar 2016 22:52
    Samstag, 9. Januar 2016 20:04
    Moderator

Alle Antworten

  • Hallo Klaus,

    ob eine Klasse einen Setter hat oder nicht lässt sich nur zur Compile-Zeit bestimmen. Im nachhinein geht das nicht mehr. Wenn das zurück gegebene Objekt immer den selben Typ haben soll, so haben auch entweder alle oder keines einen Setter für die Eigenschaft.

    Eine Möglichkeit besteht darin die Klasse erst zur Laufzeit zu kompilieren und dann dynamisch zu bestimmen ob die Setter mit enthalten sein sollen. Ohne weitere Hintergründe bezweifle ich aber dass sich das lohnt.

    Möglich wäre ebenfalls eine Exception auszulösen, sobald man versucht einen Wert zu setzen. Das könntest du über eine Zusätzliche Eigenschaft in der Klasse bestimmen, welche du ggf. auf true/false setzt. Damit ist zwar ds Zuweisen erstmal möglich, aber die weitere Ausführung des Programms nicht.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert K. Pater Dienstag, 12. Januar 2016 22:52
    Samstag, 9. Januar 2016 20:04
    Moderator
  • Anmerkung zu Tom:

    Es gibt auch im .NET-Framework Klassen, die mittels einer internen variable bestimmen, ob das schreiben erlaubt ist.

    Beispiel: SecureString-Klasse:

    Sie hat folgende Methoden:

         [System.Security.SecuritySafeCritical]  // auto-generated
            [MethodImplAttribute(MethodImplOptions.Synchronized)]
            public void MakeReadOnly() {
                EnsureNotDisposed();
                m_readOnly = true;
            }
    
            private void EnsureNotReadOnly() {
                if( m_readOnly) {
                    throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ReadOnly"));
                }
                Contract.EndContractBlock();
            }

    Wenn eine Funktion, z.B.public void InsertAt( int index, char c ), dann ruft diese die EnsureNotReadOnly()-Methode auf. Wenn das Objekt ReadOnly ist, wird ein Fehler geworfen.

    Evtl. hilft dir dieses Konzept.


    © 2015 Thomas Roskop
    Germany //  Deutschland

    Sonntag, 10. Januar 2016 16:17
  • Hallo Klaus,

    Es ist umsetzbar. Sieh dir hierzu das Entwurfsmuster "Fabrik" (Factory) an, außerdem benötigst Du Vererbung.

    Gruß



    - Florian

    Montag, 11. Januar 2016 10:36
  • Hallo Tom, hallo Thomas,

    Danke für eure Antworten. Natürlich würden in jedem Fall differente Typen entstehen, dass habe ich wohl mal kurzfristig übersehen :-)

    Eine Eigenschaft zu definieren die die Verwendbarkeit des Setters angibt, hatte ich auch schon mal überlegt, ist aber keine Option. Also bleibt es erst mal bei 2 Klassen, einer mit und eine ohne Setter.

    Gruß, Klaus

    Montag, 11. Januar 2016 11:15
  • Hallo Florian,

    so ist das... Antwort beginnen... Kaffee trinken... absenden. Dein Vorschlag kam irgendwann dazwischen :)

    Ich sehe den Weg noch nicht so ganz, werde mir das Thema aber noch mal ansehen.

    Gruß, Klaus

    Montag, 11. Januar 2016 11:42
  • Hallo Klaus,

    das passiert wohl jedem.

    Hab noch zwei Links zum Thema Fabrik:
    http://openbook.rheinwerk-verlag.de/oop/oop_kapitel_07_002.htm

    https://de.wikipedia.org/wiki/Abstrakte_Fabrik

    Gruß


    - Florian

    Montag, 11. Januar 2016 11:46