2010-01-15 5 views
3

Question particulière:Héritage et interfaces .NET

Imaginez que j'ai une classe de base appelée BaseFoo. J'ai une interface avec certaines méthodes appelées IFoo. Et j'ai des tonnes de cours sous BaseFoo.

Si j'implémente l'interface dans BaseFoo, je n'ai pas besoin d'implémenter dans les classes héritées, correct?

Ok, mais imaginez que j'ai une fonction générique qui va traiter IFoo. Ai-je besoin de déclarer explicitement qu'ils implémentent IFoo?

Vous aimez cette (pseudo-code illustrational)

public class BaseFoo:IFoo; 

public interface IFoo; 

dois-je faire cela?

public class AmbarFoo:BaseFoo,IFoo 

ou?

public class AmbarFoo:BaseFoo 

Quelle est la manière la plus correcte? Les effets sont-ils les mêmes? Si je teste si AmbarFoo est un IFoo, que vais-je recevoir?

Merci

Répondre

7

Il se comportera de la même manière indépendamment. Vous devez uniquement redéfinir le nom de l'interface si vous souhaitez réimplémenter l'interface avec l'implémentation explicite de l'interface. Une instance de AmbarFoo va en effet "dire" qu'elle implémente IFoo.

+0

Merci! Exactement la réponse dont j'avais besoin. – Joooohn

+0

Je pense que Jon Skeet devrait sauter des questions comme celle-ci. –

+1

Je pense que nous avons besoin d'un site JonSkeetFacts.com à la http://www.chucknorrisfacts.com/ –

0

Si j'implémentent l'interface dans BaseFoo, je ne dois mettre en œuvre les classes héritées, correct?

Non, car BaseFoo sera forcé de l'implémenter et les classes enfants hériteront de l'implémentation. Ils seront tous encore IFoos.

0

Dans votre cas, cela ne changera rien.

Cependant, regardez le suivant:

public interface IFoo 
{ 
    void Bar(); 
} 

public class FooBase 
    : IFoo 
{ 
    public void Bar() 
    { 
     Console.WriteLine("FooBase"); 
    } 
} 

public sealed class SubFoo 
    : FooBase//, IFoo 
{ 
    public new void Bar() 
    { 
     Console.WriteLine("SubFoo"); 
    } 
} 

Maintenant, exécutez ce qui suit et commentez les "//, IFoo".

SubFoo foo = new SubFoo(); 

foo.Bar(); 
((IFoo) foo).Bar(); 

Cependant, ceci est plus théorique.

Laissez-le.