Chcę wiedzieć, czy klasa może dziedziczyć po klasie i interfejsie. Poniższy przykładowy kod nie działa, ale myślę, że przekazuje to, co chcę zrobić. Powodem, dla którego chcę to zrobić, jest to, że w mojej firmie produkujemy urządzenia USB, szeregowe, Ethernet itp. Próbuję opracować ogólny komponent / interfejs, którego będę mógł używać do pisania programów dla wszystkich naszych urządzeń, które pomogą utrzymać te same typowe rzeczy (takie jak podłączanie, odłączanie, pobieranie oprogramowania układowego) dla wszystkich naszych aplikacji.
Aby dodać do tego pytania: Jeśli GenericDevice jest w innym projekcie, czy mogę umieścić interfejs IOurDevices w tym projekcie, a następnie sprawić, aby klasa USBDevice zaimplementowała interfejs, jeśli dodam odwołanie do pierwszego projektu? Ponieważ chciałbym odwołać się tylko do jednego projektu, a następnie zaimplementować różne interfejsy w zależności od tego, jakie jest urządzenie.
class GenericDevice
{
private string _connectionState;
public connectionState
{
get{return _connectionState; }
set{ _connectionState = value;}
}
}
interface IOurDevices
{
void connectToDevice();
void DisconnectDevice();
void GetFirmwareVersion();
}
class USBDevice : IOurDevices : GenericDevice
{
//here I would define the methods in the interface
//like this...
void connectToDevice()
{
connectionState = "connected";
}
}
//so that in my main program I can do this...
class myProgram
{
main()
{
USBDevice myUSB = new USBDevice();
myUSB.ConnectToDevice;
}
}
źródło
Odpowiedzi:
Tak. Próbować:
class USBDevice : GenericDevice, IOurDevice
Uwaga: Klasa bazowa powinna znajdować się przed listą nazw interfejsów.
Oczywiście nadal będziesz musiał zaimplementować wszystkie elementy członkowskie zdefiniowane przez interfejsy. Jeśli jednak klasa bazowa zawiera element członkowski, który pasuje do elementu członkowskiego interfejsu, element członkowski klasy bazowej może działać jako implementacja elementu członkowskiego interfejsu i nie jest wymagane ponowne jego ręczne wdrażanie.
źródło
USBDevice : IOurDevice
. Dodanie implementacji jawnie nie wpływa na klasę bazową, ale może pomóc położyć nacisk na interfejs.Nie, nie do końca. Ale może dziedziczyć z klasy i implementować jeden lub więcej interfejsów.
Przy omawianiu takich pojęć ważna jest jasna terminologia. Jedną z rzeczy, które zobaczysz, wyróżniającą na przykład pisma Jona Skeeta, zarówno tutaj, jak iw druku, jest to, że zawsze jest precyzyjny w sposobie, w jaki opisuje rzeczy.
źródło
Nie ma związku z pytaniem (odpowiedź Mehrdada powinna cię zachęcić) i mam nadzieję, że nie jest to trudne: klasy nie dziedziczą interfejsów, ale je implementują .
.NET nie obsługuje dziedziczenia wielokrotnego, więc proste sformułowanie warunków może pomóc w komunikacji. Klasa może dziedziczyć z jednej nadklasy i może implementować dowolną liczbę interfejsów.
W odpowiedzi na komentarz Erica ... przeprowadziłem dyskusję z innym deweloperem na temat tego, czy interfejsy „dziedziczą”, „implementują”, „wymagają” czy „przenoszą” interfejsy z deklaracją taką jak:
public interface ITwo : IOne
Odpowiedź techniczna jest taka,
ITwo
że dziedziczyIOne
z kilku powodów:ITwo
implementacjeIOne
jest całkowicie błędneITwo
dziedziczyIOne
metody, jeśliMethodOne()
istnieje,IOne
to jest również dostępny zITwo
. tj .:((ITwo)someObject).MethodOne())
jest poprawne, mimo żeITwo
nie zawiera wyraźnie definicjiMethodOne()
typeof(IOne).IsAssignableFrom(typeof(ITwo))
zwrotytrue
W końcu zgodziliśmy się, że interfejsy obsługują prawdziwe / pełne dziedziczenie. Brakujące funkcje dziedziczenia (takie jak przesłonięcia, abstrakcyjne / wirtualne metody dostępu itp.) Są niedostępne w interfejsach, a nie w dziedziczeniu interfejsu. Wciąż nie czyni to koncepcji prostą ani jasną, ale pomaga zrozumieć, co naprawdę dzieje się pod maską w świecie Erica :-)
źródło
Znalazłem odpowiedź na drugą część moich pytań. Tak, klasa może implementować interfejs należący do innej klasy, o ile interfejs jest zadeklarowany jako publiczny.
źródło
class ContainsAll { private interface INested { /* ... */ } private class MyExample : INested { /* ... */ } }
TheMyExample
klasa implementuje zagnieżdżony prywatny interfejs. W innych przykładach zagnieżdżony interfejs (i klasa zawierająca) mógłby byćinternal
. Wszystko zależy od tego, kto musi ich używać i zawracać sobie głowę nimi.