Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Überprüfen ob Klasse ein Interface implementiert
John Doe
myCSharp.de - Member

Avatar #avatar-1739.jpg


Dabei seit:
Beiträge: 149

Themenstarter:

Überprüfen ob Klasse ein Interface implementiert

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Xqgene
myCSharp.de - Member



Dabei seit:
Beiträge: 2.051

beantworten | zitieren | melden

if (Klasse is Interface)
...
"A programmer is a tool which converts coffein to code."

Evely ToDo-Manager 1.2 (Build 1.2.585)
private Nachricht | Beiträge des Benutzers
talla
myCSharp.de - Experte

Avatar #avatar-3214.jpg


Dabei seit:
Beiträge: 6.862
Herkunft: Esslingen

beantworten | zitieren | melden

Zitat
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.
private Nachricht | Beiträge des Benutzers
Xqgene
myCSharp.de - Member



Dabei seit:
Beiträge: 2.051

beantworten | zitieren | melden

Zitat
Original von talla
Zitat
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()
        {
        }
    }
}
"A programmer is a tool which converts coffein to code."

Evely ToDo-Manager 1.2 (Build 1.2.585)
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
talla
myCSharp.de - Experte

Avatar #avatar-3214.jpg


Dabei seit:
Beiträge: 6.862
Herkunft: Esslingen

beantworten | zitieren | melden

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:
Zitat
TestIntarface
Baka wa shinanakya naoranai.

Mein XING Profil.
private Nachricht | Beiträge des Benutzers
Xqgene
myCSharp.de - Member



Dabei seit:
Beiträge: 2.051

beantworten | zitieren | melden

Zitat
Original von talla
aber interessant find ich Xqgenes Schreibweise von Interface:
Zitat
TestIntarface
:D

"A programmer is a tool which converts coffein to code."

Evely ToDo-Manager 1.2 (Build 1.2.585)
private Nachricht | Beiträge des Benutzers
Robert G
myCSharp.de - Member

Avatar #avatar-1907.png


Dabei seit:
Beiträge: 347
Herkunft: München

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
John Doe
myCSharp.de - Member

Avatar #avatar-1739.jpg


Dabei seit:
Beiträge: 149

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Traumzauberbaum
myCSharp.de - Member



Dabei seit:
Beiträge: 512

beantworten | zitieren | melden

Zitat
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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Traumzauberbaum,
Zitat
Im MSDN hatte ich irgendwo gelesen dass man IsSubClassOf nicht benutzen soll.
Vermutlich meinst du:
Zitat
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
private Nachricht | Beiträge des Benutzers