Částečné třídy a metody (Průvodce programováním v C#)

Definici třídy, struktury, rozhraní nebo metody je možné rozdělit na dva nebo více zdrojových souborů. Každý zdrojový soubor obsahuje oddíl definice typu nebo metody a všechny části jsou kombinovány při kompilaci aplikace.

Částečné třídy

Rozdělení definice třídy je žádoucí v několika situacích:

  • Deklarování třídy nad samostatnými soubory umožňuje více programátorům pracovat na ní současně.
  • Do třídy můžete přidat kód, aniž byste museli znovu vytvořit zdrojový soubor, který obsahuje automaticky vygenerovaný zdroj. Visual Studio tento přístup používá při vytváření model Windows Forms, kódu obálky webové služby atd. Můžete vytvořit kód, který tyto třídy používá, aniž byste museli upravovat soubor vytvořený sadou Visual Studio.
  • Generátory zdrojů můžou generovat další funkce ve třídě.

Pokud chcete rozdělit definici třídy, použijte modifikátor částečného klíčového slova, jak je znázorněno zde:

public partial class Employee
{
    public void DoWork()
    {
    }
}

public partial class Employee
{
    public void GoToLunch()
    {
    }
}

Klíčové partial slovo označuje, že jiné části třídy, struktury nebo rozhraní mohou být definovány v oboru názvů. Všechny části musí používat partial klíčové slovo. Všechny části musí být k dispozici v době kompilace, aby bylo možné vytvořit konečný typ. Všechny části musí mít stejnou přístupnost, například public, privateatd.

Pokud je některá část deklarována jako abstraktní, považuje se celý typ za abstraktní. Pokud je některá část deklarována zapečetěná, považuje se celý typ zapečetěný. Pokud některá část deklaruje základní typ, celý typ dědí danou třídu.

Všechny části, které určují základní třídu, musí souhlasit, ale části, které vynechat základní třídu stále dědí základní typ. Části mohou určovat různá základní rozhraní a konečný typ implementuje všechna rozhraní uvedená všemi částečnými deklaracemi. Všechny třídy, struktury nebo členy rozhraní deklarované v částečné definici jsou k dispozici pro všechny ostatní části. Posledním typem je kombinace všech částí v době kompilace.

Poznámka:

partial Modifikátor není k dispozici pro deklarace delegátu nebo výčtu.

Následující příklad ukazuje, že vnořené typy mohou být částečné, i když typ, který jsou vnořený uvnitř, není sám o sobě částečný.

class Container
{
    partial class Nested
    {
        void Test() { }
    }

    partial class Nested
    {
        void Test2() { }
    }
}

V době kompilace se sloučí atributy definic částečného typu. Představte si například následující deklarace:

[SerializableAttribute]
partial class Moon { }

[ObsoleteAttribute]
partial class Moon { }

Jsou ekvivalentní následujícím deklaracím:

[SerializableAttribute]
[ObsoleteAttribute]
class Moon { }

Ze všech definic částečného typu se sloučí následující:

  • Komentáře XML
  • rozhraní
  • Atributy parametrů obecného typu
  • class – atributy
  • členové

Představte si například následující deklarace:

partial class Earth : Planet, IRotate { }
partial class Earth : IRevolve { }

Jsou ekvivalentní následujícím deklaracím:

class Earth : Planet, IRotate, IRevolve { }

Omezení

Při práci s částečnými definicemi tříd je potřeba dodržovat několik pravidel:

  • Všechny definice částečného typu, které mají být součástí stejného typu, musí být změněny pomocí partial. Například následující deklarace tříd generují chybu:
    public partial class A { }
    //public class A { }  // Error, must also be marked partial
    
  • partial Modifikátor může být zobrazen pouze bezprostředně před klíčovým slovem class, structnebo interface.
  • Vnořené částečné typy jsou povoleny v definicích částečného typu, jak je znázorněno v následujícím příkladu:
    partial class ClassWithNestedClass
    {
        partial class NestedClass { }
    }
    
    partial class ClassWithNestedClass
    {
        partial class NestedClass { }
    }
    
  • Všechny definice částečného typu, které mají být součástí stejného typu, musí být definovány ve stejném sestavení a stejném modulu (.exe nebo .dll souboru). Částečné definice nemohou zahrnovat více modulů.
  • Název třídy a parametry obecného typu se musí shodovat se všemi definicemi částečného typu. Obecné typy můžou být částečné. Každá částečná deklarace musí používat stejné názvy parametrů ve stejném pořadí.
  • Následující klíčová slova v definici částečného typu jsou nepovinná, ale pokud jsou k dispozici u jedné definice částečného typu, nemohou být v konfliktu s klíčovými slovy zadanými v jiné částečné definici stejného typu:

Další informace naleznete v tématu Omezení parametrů typu.

Příklady

V následujícím příkladu jsou pole a konstruktor třídy Coordsdeklarovány v jedné částečné definici třídy a člen, PrintCoordsje deklarován v jiné částečné definici třídy.

public partial class Coords
{
    private int x;
    private int y;

    public Coords(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}

public partial class Coords
{
    public void PrintCoords()
    {
        Console.WriteLine("Coords: {0},{1}", x, y);
    }
}

class TestCoords
{
    static void Main()
    {
        Coords myCoords = new Coords(10, 15);
        myCoords.PrintCoords();

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
// Output: Coords: 10,15

Následující příklad ukazuje, že můžete také vyvíjet částečné struktury a rozhraní.

partial interface ITest
{
    void Interface_Test();
}

partial interface ITest
{
    void Interface_Test2();
}

partial struct S1
{
    void Struct_Test() { }
}

partial struct S1
{
    void Struct_Test2() { }
}

Částečné metody

Částečná třída nebo struktura může obsahovat částečnou metodu. Jedna část třídy obsahuje podpis metody. Implementace může být definována ve stejné nebo jiné části.

Implementace není nutná pro částečnou metodu, pokud podpis dodržuje následující pravidla:

  • Deklarace neobsahuje žádné modifikátory přístupu. Metoda má private ve výchozím nastavení přístup.
  • Návratový typ je void.
  • Žádný z parametrů nemá out modifikátor.
  • Deklarace metody nemůže obsahovat žádný z následujících modifikátorů:

Metoda a všechna volání metody se odeberou v době kompilace, pokud neexistuje žádná implementace.

Každá metoda, která nevyhovuje všem těmto omezením (například public virtual partial void metodě), musí poskytnout implementaci. Tato implementace může být dodána zdrojem generátoru.

Částečné metody umožňují implementaci jedné části třídy deklarovat metodu. Implementátor jiné části třídy může tuto metodu definovat. Existují dva scénáře, kdy je toto oddělení užitečné: šablony, které generují často používaný kód, a generátory zdrojů.

  • Kód šablony: Šablona si vyhrazuje název metody a podpis, aby vygenerovaný kód mohl metodu volat. Tyto metody se řídí omezeními, která vývojářům umožňují rozhodnout se, jestli metodu implementuje. Pokud metoda není implementována, kompilátor odebere podpis metody a všechna volání metody. Volání metody, včetně všech výsledků, které by nastaly z vyhodnocení argumentů ve voláních, nemají žádný účinek v době běhu. Proto jakýkoli kód v částečné třídě může volně používat částečnou metodu, i když implementace není zadána. Pokud je volána metoda, ale není implementována, nedojde k žádným chybám kompilace ani chyby za běhu.
  • Generátory zdrojů: Zdrojové generátory poskytují implementaci metod. Vývojář člověka může přidat deklaraci metody (často s atributy přečtenými generátorem zdroje). Vývojář může napsat kód, který tyto metody volá. Zdrojový generátor běží během kompilace a poskytuje implementaci. V tomto scénáři se omezení částečných metod, které nemusí být implementované, často nedodržuje.
// Definition in file1.cs
partial void OnNameChanged();

// Implementation in file2.cs
partial void OnNameChanged()
{
  // method body
}
  • Deklarace částečné metody musí začínat kontextovým klíčovým slovem částečným.
  • Podpisy částečné metody v obou částech částečného typu se musí shodovat.
  • Částečné metody můžou mít statické a nebezpečné modifikátory.
  • Částečné metody mohou být obecné. Omezení musí být stejná pro definici a implementaci deklarace metody. Názvy parametrů a typů nemusí být v implementující deklaraci stejné jako v definici.
  • Delegáta můžete nastavit na částečnou definovanou a implementovanou metodu, ale ne na částečnou metodu, která nemá implementaci.

Specifikace jazyka C#

Další informace naleznete v části Částečné typy a Částečné metody ve specifikaci jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#. Další funkce pro částečné metody jsou definovány ve specifikaci funkce.

Viz také