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ę!
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ę!
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.
Ah, sądzisz, że tak było, dziękuję za wyczyszczenie! – Kukks
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
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
.
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
Rozumiem: "Niespójna dostępność: interfejs podstawowy" IBaseInterface "jest mniej dostępny niż interfejs" IDescendantOfBaseInterface ". C# 4.0. –
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.
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() { }
}
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.
Przeczytałem ponownie pytanie i nadal uważam, że potrzebujesz przykładu. – mythz
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. –
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