none
Funktionen übergeben RRS feed

  • Frage

  • Hallo Leute,
    ich habe in einer Klasse (myClass) - welche mir als Schnittstelle zu unterschiedlicher Hardware fungiert - unterschiedlichste Funktionen.
    Für die unterschiedliche Hardware sind bestimmte Funktionen erlaubt und andere wieder nicht.

    Nun möchte ich eine Funktion innerhalb dieser Klasse bauen, die mir zurückgibt, ob die Funktion für den übergebenen Hardwaretyp erlaubt ist oder nicht.


    zB.:

    public bool IsFunctionAvailable(object o, enumHardwareTyp HardwareTyp) {...}


    der Aufruf durch: (geht so nicht)

    bool funktionverfügbar = myClass.IsFunctionAvailable(myClass.function1 , Hardware1) 


    Wie kann ich das Problem lösen?
    Vielen Dank im Voraus
    Christian


    Christian Tauschek

    Freitag, 22. Mai 2015 18:19

Antworten

  • Hallo,
    ich meine es nun verstanden zu haben. Das Problem was ich da sehe ist, dass du nicht einfach die Funktion als Verweis o.ä. übergeben kannst. Zumindest nicht so um am Ende etwas damit anfangen zu können. Daher schlage ich dir vor ein 2. Enum für die Methoden selbst anzulegen:

    enum Methods{
     M1,
     M2,
     M3
     ...
    }
    Dann kannst du innerhalb der Funktion die 2 Enum-Werte mit einander abgleichen. Wobei die Logik eigentlich auch in MyClass ausgelagert werden könnte. Eben dort hin, wo auch die Methoden selbst sind.


    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

    Freitag, 22. Mai 2015 22:27
    Moderator
  • Hallo Christian,
    ich würde das so lösen:

    Jeder Hardwaretyp ist eine eigene Klasse. Die Logik, ob eine Hardware was aufrufen darf, sollte aber in den Hardwareklassen selbst liegen. Denn die einzelne Hardware weiss doch am besten was sie kann / darf und was nicht, oder? ;-)

    Zudem ersparst du dir dann noch die Parameterisiererei mit der Enumeration, da der Type der Hardware bereits aus dem Objekt selbst hervorgeht.

    public interface HardwareVeryfier {
    		bool CanRead();
    		bool CanWrite();
    	}
    
    	public class Hardware1 : HardwareVeryfier {
    		#region HardwareVeryfier Members
    
    		public bool CanRead() {
    			return true;
    		}
    
    		public bool CanWrite() {
    			return true;
    		}
    
    		#endregion
    	}
    
    	public class Hardware2 : HardwareVeryfier {
    		#region HardwareVeryfier Members
    
    		public bool CanRead() {
    			return true;
    		}
    
    		public bool CanWrite() {
    			return false;
    		}
    
    		#endregion
    	}
    
    	public class MyClass {
    
    		public bool CanRead(HardwareVeryfier hardware) {
    			return hardware.CanRead();
    		}
    
    		public bool CanWrite(HardwareVeryfier hardware) {
    			return hardware.CanWrite();
    		}
    	}
    Ich hoffe, ich habe deine Frage richtig Verstanden und konnte dir weiterhelfen :)


    Viele Grüße Holger M. Rößler

    Samstag, 23. Mai 2015 06:03

Alle Antworten

  • Hallo Christian,

    ob eine Funktion vorhanden ist kannst du beispielsweise über Reflection heraus bekommen:

    if (myObject.GetType().GetMethod("MethodName") == null)
    {
        //nicht vorhanden
    }
    Das funktioniert allerdings nur, wenn es wirklich darum geht ob myObject etwas implementiert hat oder nicht. Ob anderweitig der Aufruf scheitern wird kann damit nicht bestimmt werden. Das musst du direkt in der Klasse mit ablegen (Dictionary<TK,TV> o.ä.).

    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

    Freitag, 22. Mai 2015 21:30
    Moderator
  • Hallo Tom, ich möchte nicht, prüfen, ob eine Funktion vorhanden ist, denn das ist ohnehin der Fall. Es sollte mir nur zurückgegeben werden, ob die Funktion in Abhängigkeit des übergebenen Hardwaretyps verwendet werden darf. Zb. darf bei einem bestimmten Hardwaretyp die eine oder andere Funktion nicht aufgerufen werden und die Logik wer was darf ist auch in der myClass hinterlegt. Natürlich könnte ich es auch so machen, dass ich zB. für eine Funktion LadeWert() zusätzlich eine Funktion LadeWertIsAllowed(Hardwaretyp) einbaue, was aber umständlich ist und ich dadurch doppelt so viele Funktionen habe. MfG Christian

    Christian Tauschek

    Freitag, 22. Mai 2015 22:08
  • Hallo,
    ich meine es nun verstanden zu haben. Das Problem was ich da sehe ist, dass du nicht einfach die Funktion als Verweis o.ä. übergeben kannst. Zumindest nicht so um am Ende etwas damit anfangen zu können. Daher schlage ich dir vor ein 2. Enum für die Methoden selbst anzulegen:

    enum Methods{
     M1,
     M2,
     M3
     ...
    }
    Dann kannst du innerhalb der Funktion die 2 Enum-Werte mit einander abgleichen. Wobei die Logik eigentlich auch in MyClass ausgelagert werden könnte. Eben dort hin, wo auch die Methoden selbst sind.


    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

    Freitag, 22. Mai 2015 22:27
    Moderator
  • Hallo Christian,
    ich würde das so lösen:

    Jeder Hardwaretyp ist eine eigene Klasse. Die Logik, ob eine Hardware was aufrufen darf, sollte aber in den Hardwareklassen selbst liegen. Denn die einzelne Hardware weiss doch am besten was sie kann / darf und was nicht, oder? ;-)

    Zudem ersparst du dir dann noch die Parameterisiererei mit der Enumeration, da der Type der Hardware bereits aus dem Objekt selbst hervorgeht.

    public interface HardwareVeryfier {
    		bool CanRead();
    		bool CanWrite();
    	}
    
    	public class Hardware1 : HardwareVeryfier {
    		#region HardwareVeryfier Members
    
    		public bool CanRead() {
    			return true;
    		}
    
    		public bool CanWrite() {
    			return true;
    		}
    
    		#endregion
    	}
    
    	public class Hardware2 : HardwareVeryfier {
    		#region HardwareVeryfier Members
    
    		public bool CanRead() {
    			return true;
    		}
    
    		public bool CanWrite() {
    			return false;
    		}
    
    		#endregion
    	}
    
    	public class MyClass {
    
    		public bool CanRead(HardwareVeryfier hardware) {
    			return hardware.CanRead();
    		}
    
    		public bool CanWrite(HardwareVeryfier hardware) {
    			return hardware.CanWrite();
    		}
    	}
    Ich hoffe, ich habe deine Frage richtig Verstanden und konnte dir weiterhelfen :)


    Viele Grüße Holger M. Rößler

    Samstag, 23. Mai 2015 06:03