Interfacce multiple
Fa parte della sezione Programmazione orientata agli oggetti del percorso C# di Coddy. Lezione 27 di 70.
Una classe può ereditare da una sola classe base, ma può implementare tutte le interfacce necessarie. Questo è uno dei principali vantaggi delle interfacce rispetto alle classi astratte: permettono a una classe di adottare più comportamenti.
Per implementare più interfacce, elencale semplicemente dopo i due punti, separate da virgole:
public interface IFlyable
{
void Fly();
}
public interface ISwimmable
{
void Swim();
}
public class Duck : IFlyable, ISwimmable
{
public void Fly()
{
Console.WriteLine("Flying through the air");
}
public void Swim()
{
Console.WriteLine("Swimming in the pond");
}
}La classe Duck deve implementare tutti i membri di entrambe le interfacce. Questo rappresenta in modo naturale gli scenari del mondo reale: un’anatra può davvero sia volare sia nuotare, quindi è sensato che rispetti entrambi i contratti.
Quando combini l'ereditarietà con più interfacce, la classe base deve venire per prima:
public class Duck : Bird, IFlyable, ISwimmable
{
// Eredita da Bird e implementa entrambe le interfacce
}Questa flessibilità ti consente di combinare comportamenti provenienti da più fonti. Un Robot potrebbe implementare IMovable, IChargeable e ISpeakable. Ogni interfaccia rappresenta una singola capacità e la tua classe può combinare esattamente ciò di cui ha bisogno.
Sfida
FacileCostruiamo un sistema di dispositivi per la casa intelligente che dimostri come una singola classe possa implementare più interfacce per acquisire capacità diverse. Creerai dispositivi che possono essere controllati e che dispongono di funzionalità di gestione dell'alimentazione.
Organizzerai il codice in quattro file:
IControllable.cs: definisci un'interfaccia chiamataIControllablenello spazio dei nomiSmartHome. Questa interfaccia rappresenta i dispositivi che possono essere accesi e spenti. Dovrebbe dichiarare due metodi:TurnOn()eTurnOff(), entrambi con un valore restituito di tipo stringa.INetworkConnected.cs: definisci un'interfaccia chiamataINetworkConnectednello spazio dei nomiSmartHome. Questa interfaccia rappresenta i dispositivi che possono connettersi a una rete. Dovrebbe dichiarare un metodoConnect(string network)che restituisce una stringa.SmartTV.cs: definisci una classeSmartTVnello spazio dei nomiSmartHomeche implementa siaIControllablesiaINetworkConnected. La TV dovrebbe avere una proprietàBrand(stringa) e una proprietàScreenSize(int, che rappresenta i pollici). Crea un costruttore che accetti entrambi i valori. Implementa tutti i metodi dell'interfaccia:TurnOn()restituisce"{Brand} {ScreenSize}-inch TV is now ON"TurnOff()restituisce"{Brand} {ScreenSize}-inch TV is now OFF"Connect(string network)restituisce"{Brand} TV connected to {network}"
Program.cs: nel file principale, crea unaSmartTVusando i valori di input. Mostra la flessibilità delle interfacce multiple memorizzando lo stesso oggetto TV in variabili di tre tipi diversi: il tipo concretoSmartTV, una variabileIControllablee una variabileINetworkConnected. Chiama i metodi appropriati tramite ciascun riferimento per mostrare come lo stesso oggetto possa essere usato in modo diverso a seconda dell'interfaccia con cui stai lavorando.
Riceverai tre input:
- Nome della marca della TV
- Dimensioni dello schermo in pollici
- Nome della rete a cui connettersi
Stampa l'output in questo formato:
Via SmartTV:
{TurnOn() result}
{Connect(network) result}
Via IControllable:
{TurnOff() result}
Via INetworkConnected:
{Connect(network) result}Ad esempio, se gli input sono Samsung, 55 e HomeWiFi, l'output dovrebbe essere:
Via SmartTV:
Samsung 55-inch TV is now ON
Samsung TV connected to HomeWiFi
Via IControllable:
Samsung 55-inch TV is now OFF
Via INetworkConnected:
Samsung TV connected to HomeWiFiNota come lo stesso oggetto SmartTV possa essere usato tramite riferimenti a interfacce diverse. Quando è memorizzato come IControllable, puoi chiamare solo i metodi di controllo. Quando è memorizzato come INetworkConnected, puoi chiamare solo i metodi di rete. Questo è il vantaggio di implementare più interfacce: una classe acquisisce capacità multiple, pur rimanendo flessibile nelle modalità d'uso!
Provalo tu
using System;
using SmartHome;
class Program
{
public static void Main(string[] args)
{
// Lee las entradas
string brand = Console.ReadLine();
int screenSize = Convert.ToInt32(Console.ReadLine());
string network = Console.ReadLine();
// TODO: Crea un objeto SmartTV con los valores de entrada
// TODO: Guarda el mismo objeto TV en tres tipos de variables diferentes:
// 1. Tipo SmartTV (clase concreta)
// 2. Tipo IControllable (referencia de interfaz)
// 3. Tipo INetworkConnected (referencia de interfaz)
// TODO: Imprime la salida en el formato requerido:
// Via SmartTV:
// - Llama a TurnOn() y Connect(network)
// Via IControllable:
// - Llama a TurnOff()
// Via INetworkConnected:
// - Llama a Connect(network)
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniNamespace e direttiveIntroduzione a classi e oggettiLa parola chiave "this"Metodi e parametriCampi e proprietàCostruttoriInizializzatori di oggettiRiepilogo - Calcolatrice semplice4Ereditarietà
Sintassi di base dell'ereditarietà (:)La parola chiave 'base'Parole chiave virtual e overrideClassi sealedLa classe base 'object'Riepilogo - Gerarchia dei dipendenti7Funzionalità avanzate
Sovraccarico degli operatoriIndicizzatori (this[])Override di ToString()Metodi di estensioneRiepilogo - Lista personalizzata10Pattern di progettazione Parte 1
Introduzione ai pattern di progettazioneSingleton thread-safePattern FactoryPattern Observer (eventi)Pattern Strategy2Proprietà e membri statici
Proprietà implementate automaticamenteProprietà di sola lettura e di sola scritturaCampi e metodi staticiClassi staticheMembri con corpo di espressione5Polimorfismo e interfacce
Polimorfismo a compile time e runtimeInterfaccia o classe astrattaInterfacce multipleInterfacce espliciteUpcasting e downcastingRipasso: calcolatore di forme8Concetti avanzati di programmazione a oggetti
Composizione invece dell'ereditarietàTipi generici (classi e metodi)Delegati ed eventiAttributi e reflectionIDisposable e istruzione usingNozioni di base sull'iniezione delle dipendenze11Pattern di progettazione, parte 2
Pattern del ComandoPattern dell’AdattatorePattern del DecoratorePattern Template MethodPattern dello StatoPattern Composito3Architettura delle classi
Dati di istanza vs staticiParole chiave 'readonly' e 'const'Campi di supportoRiepilogo - Gestore di conti bancari6Incapsulamento
Modificatori di accessoProprietà per l'incapsulamentoImplementazione dell'occultamento dei datiModelli di immutabilitàRiepilogo - Registri degli studentiEsercitati da solo: Compilatore C# online