Laden...

Überprüfen ob Klasse ein Interface implementiert

Erstellt von John Doe vor 17 Jahren Letzter Beitrag vor 17 Jahren 7.134 Views
John Doe Themenstarter:in
149 Beiträge seit 2005
vor 17 Jahren
Überprüfen ob Klasse ein Interface implementiert

Hallo Leute!

Ich habe hier ein kleine Problem. Ich habe 2 Interfaces: A & B. Interface B implementiert aber auch das Interface A. Jetzt haben ich zwei Klassen (C & D), wobei C das Interface A, und die Klasse D das Interface B implementiert (und damit auch A). Ich kann ja über das Interface A beide Klassen verwenden. Aber wie kriege ich heraus, wenn ich eine Klasse über das Interface A verwende (was ja beide implementieren), ob diese Klasse auch das Interface B implementiert?

Ich habe mir gedacht, in dem Interface A eine Möglichkeit einzubauen, an der ich erkennen kann, ob die Klasse auch B implementiert. Allerdings finde ich diese Möglichkeit ein wenig suboptimal. Und über die Möglichkeit ein Cast in einem Try-catch-Block müssen wir gar nicht erst reden.

Jetzt meine Frage: gibt es eine Möglichkeit herauszufinden ob eine Klasse ein bestimmtes Interface implementiert?

cg,
John Doe

Schon als Kindern war uns klar: Jeder von uns wird ein Star, oder Millionär - das ist doch auch nicht schwer. Dem Alkohol nicht abgeneigt, war es für uns auch nicht leicht. Durch seine Hände Arbeit, wird man auch nicht gleich ein Scheich.
X
2.051 Beiträge seit 2004
vor 17 Jahren

if (Klasse is Interface)
...

6.862 Beiträge seit 2003
vor 17 Jahren

Original von John Doe
Aber wie kriege ich heraus, wenn ich eine Klasse über das Interface A verwende (was ja beide implementieren), ob diese Klasse auch das Interface B implementiert?

Gar nicht wenn du nur über die Interfaces gehst. A weiß von B gar nichts, und sollte es auch nicht. Wenn du dagegen nen Objekt einer Klasse hast, kannst du wie Xqgene geschrieben hast prüfen.

Baka wa shinanakya naoranai.

Mein XING Profil.

X
2.051 Beiträge seit 2004
vor 17 Jahren

Original von talla

Original von John Doe
Aber wie kriege ich heraus, wenn ich eine Klasse über das Interface A verwende (was ja beide implementieren), ob diese Klasse auch das Interface B implementiert?

Gar nicht wenn du nur über die Interfaces gehst. A weiß von B gar nichts, und sollte es auch nicht. Wenn du dagegen nen Objekt einer Klasse hast, kannst du wie Xqgene geschrieben hast prüfen.

also warum soll es nicht gehen??


class TestOld
{
    static void Main()
    {
        IA a = new A();
        IA b = new B();

        TestIntarface(a);
        TestIntarface(b);
    }

    private static void TestIntarface(IA ib)
    {
        if (ib is IB)
            Console.WriteLine("Yes");
        else
            Console.WriteLine("No");
    }
    interface IA
    {
        void MethodeA();
    }
    interface IB : IA
    {
        void MethodeB();       
    }

    class A :IA
    {
        public void MethodeA()
        {
        }
    }

    class B : IB
    {
        public void MethodeB()
        {
        }
        public void MethodeA()
        {
        }
    }
}
49.485 Beiträge seit 2005
vor 17 Jahren

Hallo talla,

ich habe deinen Einwand leider nicht genau verstanden.

Ich sage mal, was m.E. geht:


A a = new IrgendeineKlasseDieAImplementierAberVonDerManNichtWeissObSieBImplementiert ();
if (a is B) {
   // ...
}

herbivore

6.862 Beiträge seit 2003
vor 17 Jahren

Joa, funktioniert, hab nen Denkfehler drin. Das A verweißt ja auf nen Objekt was B ist und ich prüf ja nicht ob das Interface vom Typ B ist, sondern das Objekt worauf des verweist.

aber interessant find ich Xqgenes Schreibweise von Interface:

TestIntarface 😁

Baka wa shinanakya naoranai.

Mein XING Profil.

X
2.051 Beiträge seit 2004
vor 17 Jahren

Original von talla
aber interessant find ich Xqgenes Schreibweise von Interface:

TestIntarface
😄

🙂

347 Beiträge seit 2006
vor 17 Jahren

Um es noch zu vervollständigen...
Falls generische Prüfungen mit der allseits beliebten Handbremse (Reflection 😁 ) nötig sind:

interface IA
{}
class A : IA
{}
Console.WriteLine("{0} implements {1}: {2}",
                  typeof(A),
                  typeof(IA),
                  typeof(IA).IsAssignableFrom(typeof(A)));

Also nicht mit IsSubClassOf prüfen...

John Doe Themenstarter:in
149 Beiträge seit 2005
vor 17 Jahren

Danke Leute! Genau das habe ich gesucht!

Schon als Kindern war uns klar: Jeder von uns wird ein Star, oder Millionär - das ist doch auch nicht schwer. Dem Alkohol nicht abgeneigt, war es für uns auch nicht leicht. Durch seine Hände Arbeit, wird man auch nicht gleich ein Scheich.
T
512 Beiträge seit 2006
vor 17 Jahren

Original von Robert G
Um es noch zu vervollständigen...
Falls generische Prüfungen mit der allseits beliebten Handbremse (Reflection 😁 ) nötig sind:

interface IA  
{}  
class A : IA  
{}  
Console.WriteLine("{0} implements {1}: {2}",  
                  typeof(A),  
                  typeof(IA),  
                  typeof(IA).IsAssignableFrom(typeof(A)));  

Also nicht mit IsSubClassOf prüfen...

Vielen Dank, das hätte ich jetzt gefragt nachdem die Eingangsfrage geklärt ist 😉

Im MSDN hatte ich irgendwo gelesen dass man IsSubClassOf nicht benutzen soll. IsAssignableFrom hab ich garnicht erst in Betracht gezogen 🙂

e.f.q.

Aus Falschem folgt Beliebiges

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Traumzauberbaum,

Im MSDN hatte ich irgendwo gelesen dass man IsSubClassOf nicht benutzen soll.

Vermutlich meinst du:

Die IsSubclassOf-Methode kann nicht verwendet werden, um zu bestimmen, ob eine Schnittstelle von einer anderen Schnittstelle abgeleitet ist oder eine Klasse eine Schnittstelle implementiert.

herbivore