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
if (Klasse is Interface)
...
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.
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()
{
}
}
}
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
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.
Original von talla
aber interessant find ich Xqgenes Schreibweise von Interface:TestIntarface
😄
🙂
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...
Danke Leute! Genau das habe ich gesucht!
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
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