Rozhraní – definovat chování pro více typů
Rozhraní obsahuje definice pro skupinu souvisejících funkcí, které nejsou abstraktní class nebo struct musí implementovat. Rozhraní může definovat static metody, které musí mít implementaci. Počínaje jazykem C# 8,0 může rozhraní definovat výchozí implementaci pro členy. Rozhraní nesmí deklarovat data instance, jako jsou pole, automaticky implementované vlastnosti nebo události podobné vlastnostem.
Pomocí rozhraní můžete například zahrnout chování z více zdrojů ve třídě. Tato funkce je důležitá v jazyce C#, protože jazyk nepodporuje vícenásobnou dědičnost tříd. Kromě toho je nutné použít rozhraní, pokud chcete simulovat dědičnost pro struktury, protože nemohou být ve skutečnosti děděny z jiné struktury nebo třídy.
Rozhraní definujete pomocí interface klíčového slova, jak ukazuje následující příklad.
interface IEquatable<T>
{
bool Equals(T obj);
}
Název rozhraní musí být platný název identifikátoruC#. Podle konvence názvy rozhraní začínají velkým písmenem I .
Libovolná třída nebo struktura, která implementuje IEquatable<T> rozhraní, musí obsahovat definici pro Equals metodu, která odpovídá signatuře, kterou určuje rozhraní. V důsledku toho můžete spočítat třídu, která implementuje, IEquatable<T> aby obsahovala metodu, Equals se kterou může instance třídy určit, zda je rovna jiné instanci stejné třídy.
Definice IEquatable<T> neposkytuje implementaci pro Equals . Třída nebo struktura může implementovat více rozhraní, ale třída může dědit pouze z jedné třídy.
Další informace o abstraktních třídách naleznete v tématu abstraktní a zapečetěné třídy a členy třídy.
Rozhraní mohou obsahovat metody instance, vlastnosti, události, indexery nebo libovolnou kombinaci těchto čtyř typů členů. Rozhraní mohou obsahovat statické konstruktory, pole, konstanty nebo operátory. Rozhraní nemůže obsahovat pole instancí, konstruktory instancí ani finalizační metody. Členy rozhraní jsou ve výchozím nastavení veřejné a můžete explicitně zadat Modifikátory dostupnosti, jako například public ,, protected internal , private , protected internal nebo private protected . privateČlen musí mít výchozí implementaci.
Chcete-li implementovat člena rozhraní, musí být odpovídající člen třídy implementace Public, nestatický a musí mít stejný název a signaturu jako člen rozhraní.
Pokud třída nebo struktura implementuje rozhraní, třída nebo struktura musí poskytovat implementaci pro všechny členy, které rozhraní deklaruje, ale neposkytuje výchozí implementaci pro. Nicméně pokud základní třída implementuje rozhraní, jakákoliv třída odvozená od základní třídy zdědí tuto implementaci.
Následující příklad ukazuje implementaci IEquatable<T> rozhraní. Implementující třída, Car musí poskytnout implementaci Equals metody.
public class Car : IEquatable<Car>
{
public string Make { get; set; }
public string Model { get; set; }
public string Year { get; set; }
// Implementation of IEquatable<T> interface
public bool Equals(Car car)
{
return (this.Make, this.Model, this.Year) ==
(car.Make, car.Model, car.Year);
}
}
Vlastnosti a indexery třídy mohou definovat nadbytečné přistupující objekty pro vlastnost nebo indexer, který je definován v rozhraní. Rozhraní může například deklarovat vlastnost, která má přistupující objekt Get . Třída, která implementuje rozhraní, může deklarovat stejnou vlastnost s get přístupovým objektem a nastavením . Pokud však vlastnost nebo indexer používá explicitní implementaci, přistupující objekty se musí shodovat. Další informace o explicitní implementaci naleznete v tématu explicitní implementace rozhraní a Vlastnosti rozhraní.
Rozhraní mohou dědit z jednoho nebo více rozhraní. Odvozené rozhraní dědí členy z jeho základních rozhraní. Třída, která implementuje odvozené rozhraní, musí implementovat všechny členy v odvozeném rozhraní, včetně všech členů základních rozhraní odvozeného rozhraní. Tato třída může být implicitně převedena na odvozené rozhraní nebo na kterékoli z jeho základních rozhraní. Třída může obsahovat rozhraní několikrát prostřednictvím základních tříd, které dědí nebo prostřednictvím rozhraní, která dědí jiná rozhraní. Nicméně třída může poskytnout implementaci rozhraní pouze jednou a pouze v případě, že třída deklaruje rozhraní jako součást definice třídy ( class ClassName : InterfaceName ). Pokud je rozhraní zděděné, protože jste zdědili základní třídu, která implementuje rozhraní, základní třída poskytuje implementaci členů rozhraní. Odvozená třída však může znovu implementovat jakékoli členy virtuálních rozhraní namísto použití zděděné implementace. Když rozhraní deklaruje výchozí implementaci metody, jakákoliv třída implementující toto rozhraní dědí tuto implementaci (pro přístup k výchozí implementaci na členu rozhraní je potřeba přetypování instance třídy na typ rozhraní).
Základní třída může také implementovat členy rozhraní pomocí virtuálních členů. V takovém případě může odvozená třída změnit chování rozhraní přepsáním virtuálních členů. Další informace o virtuálních členech naleznete v tématu polymorfismus.
Souhrn rozhraní
Rozhraní má následující vlastnosti:
- Ve verzích C# starších než 8,0 je rozhraní jako abstraktní základní třída s pouze abstraktními členy. Třída nebo struktura, která implementuje rozhraní, musí implementovat všechny jeho členy.
- Počínaje jazykem C# 8,0 může rozhraní definovat výchozí implementace pro některé nebo všechny jeho členy. Třída nebo struktura, která implementuje rozhraní, nemusí implementovat členy, které mají výchozí implementace. Další informace naleznete v tématu výchozí metody rozhraní.
- Nelze vytvořit instanci rozhraní přímo. Jeho členové jsou implementováni jakoukoliv třídou nebo strukturou, která implementuje rozhraní.
- Třída nebo struktura může implementovat více rozhraní. Třída může dědit základní třídu a také implementovat jedno nebo více rozhraní.