Benutzer mit den meisten Antworten
Klassen erstellen

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
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
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
-
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 -
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
-
Hallo Klaus,
das passiert wohl jedem.
Hab noch zwei Links zum Thema Fabrik:
http://openbook.rheinwerk-verlag.de/oop/oop_kapitel_07_002.htmhttps://de.wikipedia.org/wiki/Abstrakte_Fabrik
- Florian