2010-02-17 11 views
13

Chciałbym implementować tylko niektóre interfejsy w innych interfejsach, nie chcę, aby mogły być dziedziczone bezpośrednio przez klasę.C# Interfejsy - implementuj interfejs tylko w innych interfejsach.

Z góry dziękuję!

+4

Przeczytałem ponownie pytanie i nadal uważam, że potrzebujesz przykładu. – mythz

+1

Ponownie czytając pytanie, myślę, że pytasz o jakiś konstrukt, aby zapobiec ** bezpośredniej ** implementacji interfejsu w klasie, podczas gdy nie uniemożliwiając innym interfejsom dziedziczenie z niego. –

+0

Przykład: mam interfejs o nazwie IAnimation, chcę tylko zaimplementować ten interfejs poprzez interfejs INonAnimated lub IAnimated. W ten sposób oba podrzędne interfejsy utrzymują te same podstawowe zasady. – Kukks

Odpowiedz

25

Nie można tego zrobić w języku C# - dowolna klasa może zaimplementować dowolny interfejs, do którego ma dostęp.

Dlaczego chcesz to zrobić? Należy pamiętać, że deklarując dziedziczenia interfejsu:

public interface InterfaceA {} 
public interface InterfaceB : InterfaceA {} 

Ty określając, że coś wykonawczych InterfaceB ma również wdrożyć InterfaceA, więc dostaniesz klas wykonawczych InterfaceA tak.

+0

Ah, sądzisz, że tak było, dziękuję za wyczyszczenie! – Kukks

+0

publiczny interfejs InterfaceA {} publicznego InterfaceB interfejs: InterfaceA {} publicznego InterfaceC interfejs: InterfaceA {} InterfaceA będzie posiadać wspólny [i] zasady [/ i], że będę przy użyciu w InterfaceB i InterfaceC – Kukks

-1

Najlepszym mogę zaproponować jest je umieścić - zarówno na najwyższym poziomie i wywodzą interfejsy, w oddzielnym zespołem, z interfejsami baza poziomie deklarowanych jako internal i interfejsów, które rozciągają się te interfejsy jak public.

+0

Czy to wtedy czy możliwe jest implementowanie interfejsów najwyższego poziomu, jeśli super-interfejsy nie są dostępne dla klasy wykonawczej? – thecoop

+0

Rozumiem: "Niespójna dostępność: interfejs podstawowy" IBaseInterface "jest mniej dostępny niż interfejs" IDescendantOfBaseInterface ". C# 4.0. –

1

Po pierwsze, nie ma sensu mówić "implementuj w innych interfejsach", ponieważ interfejsy nie mogą niczego zaimplementować.

Widzę dwa błędne sposoby robienia tego, coś w rodzaju.

  1. Twórz animowane i nieAnimowane klasy abstrakcyjne, które implementują funkcję IAnimation. Klasa betonu pod nimi może nadal przymusowo przesłonić swoje metody IAnimation z nowym operatorem:

    class SomeAnim : Animated 
    { 
        public new void Foo() { } 
    } 
    
  2. Wpisz wstawek. Zachowaj IAnimated i INonAnimated jako interfejsy, ale nie umieszczaj żadnych metod w swoim interfejsie. Zamiast definiować metody rozszerzenie w ten sposób:

    static class Ext 
    { 
        public static void Foo(this IAnim anim) 
        { 
         if (anim is IAnimated) // do something 
         else if (anim is INonAnimated) // do something else 
        } 
    } 
    

znowu trochę hack. Ale to, co próbujesz zrobić, wskazuje wady projektu.

+0

Ponowne formatowanie kodu, patrz tutaj: http://meta.stackexchange.com/questions/19624/bug-in-markdown-formatter/19799#19799 Musisz wcięcie kodu o 8 spacji zamiast 4 – thecoop

+0

dzięki, Zastanawiam się, kiedy to się zmieniło ... – Tesserex

Powiązane problemy