2009-10-16 16 views
28

Czy istnieje sposób, aby konstruktor klasy częściowej mógł wywołać inną metodę, która może być zdefiniowana przeze mnie lub nie?Konstruktorzy klasy częściowej

Zasadniczo mój częściowy konstruktor klasa jest zdefiniowana:

public partial class Test 
{ 
    public Test() 
    { 
      //do stuff 
    } 
} 

Chciałbym móc jakoś wstawić dodatkowy kod do uruchomienia po konstruktor klasy nazywa.

Ponadto istnieje sposób na więcej niż jeden plik do wprowadzenia dodatkowego kodu po wywołaniu konstruktora?

Odpowiedz

49

C# obsługuje funkcję partial methods. Pozwalają one na częściową definicję klasy do przekazania deklarują metodę, którą następnie może opcjonalnie zdefiniować inna część klasy cząstkowej.

Cząstkowe metody mają pewne ograniczenia:

  • muszą mieć void typu (No Return)
  • Mogą nie przyjmuje się parametry, mogą jednak przyjąć parametry ref
  • mogą one nie być wirtualne lub extern i NIE MOŻNA nadpisać ani nadpisać innej metody (za pomocą słowa kluczowego "nowy").

Metody częściowe są niejawnie zamknięte i prywatne.

Nie jest jednak możliwe, aby dwie różne części klasy częściowej realizowały tę samą metodę częściową.Zasadniczo w klasach częściowych generowanych przez kod stosowane są częściowe metody pozwalające na nie wygenerowaną część rozszerzenia lub dostosowania zachowania wygenerowanej części (lub czasem odwrotnie). Jeśli metoda częściowa zostanie zadeklarowana, ale nie zostanie zaimplementowana w żadnej części klasy, kompilator automatycznie usunie wszystkie wywołania do niej.

Oto przykładowy kod:

public partial class PartialTestClass 
{ 
    partial void DoSomething(); 

    public PartialTestClass() { DoSomething(); } 
} 

public partial class PartialTestClass 
{ 
    partial void DoSomething() { /* code here */ } 
} 
+4

W rzeczywistości mogą akceptować parametry ref. Nie akceptują. –

+1

Tak, dzięki Mircea, naprawiłem to. – LBushkin

+4

Niestety nie można przypisać wartości do pól 'readonly' z tych metod częściowych, więc technicznie nie ma częściowych konstruktorów, nawet jeśli zdecydujesz się je wywoływać tylko z konstruktora. –

5

Wyszukiwanie "metod częściowych". Zrobią dokładnie to, co chcesz.

Na przykład:

public partial class Test 
{ 
    public Test() 
    { 
     //do stuff 

     DoExtraStuff(); 
    } 

    partial void DoExtraStuff(); 
} 


public partial class Test // in some other file 
{ 
    partial void DoExtraStuff() 
    { 
     // do more stuff 
    } 
} 
7

Cóż, w C# 3.0 można mieć tak zwane metody częściowych - metoda, która może zostać wywołana, nawet jeśli nie są one naprawdę istnieją.

Jeśli nie są zdefiniowane w żadnym z plików klas częściowych, połączenie z nimi zostanie usunięte przez kompilator/linker .NET.

Możesz więc określić np. klasa klienta:

partial class Customer 
{ 
    string name; 

    public string Name 
    { 
    get 
    { 
     return name; 
    } 
    set 
    { 
     OnBeforeUpdateName(); 
     OnUpdateName(); 
     name = value; 
     OnAfterUpdateName(); 
    } 
    } 

    partial void OnBeforeUpdateName(); 
    partial void OnAfterUpdateName(); 
    partial void OnUpdateName(); 
} 

Te częściowe metody OnBeforeUpdateName() itd., będzie nazwane, ale jeśli żaden z częściowych plików klas faktycznie ma wdrożyć coś dla nich, że rozmowa będzie bez skutku. Linq-SQL używa tego wielkiego czasu dla tego rodzaju metod powiadamiania.

Zobacz te blogach na temat metod cząstkowych:

Marcowi

+1

„class potomek”: powód do korzystania z częściową metodę, aby został on wdrożony w tym samym * * klasy, ale inny plik częściowy. Jeśli nie jest zaimplementowany w tej samej klasie, zostaje usunięty przez kompilator. – itowlson

+0

Czy jest możliwe, aby wiele klas częściowych zadeklarowało tę metodę, czy może być zadeklarowane tylko raz? – Omar

+0

@itowlson: oczywiście, przepraszam, otrzymałem częściowe metody i dziedziczenie pomieszane :-) –

Powiązane problemy