2010-05-20 19 views
39

Czy istnieje sposób, aby uniemożliwić korzystanie z domyślnego konstruktora?Zapobieganie użyciu domyślnego konstruktora

Wszystko, co mogę wymyślić, to zgłoszenie wyjątku, ale chciałbym czegoś, co powoduje błąd czasu kompilacji.

+3

może popaść w kłopoty, jeśli to zrobić: (. Wiążąco/serializacji/etc) W .NET domyślny konstruktor bez parametrów jest konieczne dla wielu rzeczy. Rozważmy ustawienia domyślne dla dowolnych wartości, które należy ustawić za pomocą parametrów konstruktora. To może nie mieć znaczenia w twoim przypadku, ale warto o tym wspomnieć. –

Odpowiedz

80
  • Jeśli wszystko w klasie jest statyczne, należy rozważyć ustawienie klasy statycznej. W ten sposób nie dostaniesz konstruktora w ogóle.
  • Jeśli chcesz konstruktora bez parametrów, ale nie ma to być publiczne, oświadczam go wyraźnie i sprawiają, że prywatny (wewnętrzny lub etc)
  • Jeśli nie chcesz konstruktora bez parametrów ale zrobić chcą konstruktorów z parametrami, a potem po prostu zadeklarować te - domyślny konstruktor nie zostanie wygenerowany dla Ciebie

I myśleć które powinny obejmować wszystkie podstawy ...

+0

Powiedziałeś właściwie dokładnie o tym, co właśnie pisałem :) – Joel

+0

Chciałbym wiedzieć o statycznych klasach dawno temu. – luiscubal

+1

, chyba że jest to struktura, a nie klasa. Jeśli tak jest, generowany jest domyślny ctor (dobrze, więc wszystkie rekwizyty są inicjowane), ale możliwy do wywołania (niestety) - tj. Chcę zmusić użytkownika do użycia ctor z parametrami. –

35

Ustaw jako prywatny.

Więc

class SomeClass 
{ 
    private SomeClass() 
    { 
    } 

    public SomeClass(int SomeParam) 
    { 
    } 
} 
+0

+1 za punkt. – corsiKa

+9

Jeśli nie jest to potrzebne w typie (lub typach zagnieżdżonych), możesz go tutaj całkowicie usunąć - zostanie wygenerowany tylko wtedy, gdy nie zostanie jawnie zadeklarowany żaden konstruktor. –

+0

@Jon Zazwyczaj jestem typem pasa i szelki, więc normalnie robiłbym to w ten sposób; w ten sposób to, co próbuję zrobić, jest jasne dla każdego, kto na nie patrzy. Dobrze wiedzieć, że jest to obsługiwane automatycznie przez kompilator, jeśli zapomnę. –

8

Można po prostu zrobić to prywatny:

private MyClass() 
{ 
} 

Alternatywnie (jeśli nie znasz już), jeśli po prostu zadeklarować konstruktor z parametrami, domyślnie jedną ISN dodane przez kompilator, np

private MyClass(string myParameter) 
{ 
    //Can't call new MyClass() anymore 
} 
5

Jedna rzecz, o której trzeba wspomnieć, że inni nie. Domyślny konstruktor powinien nadal być w stanie skonfigurować domyślne bity implementacyjne, aby uniknąć ponownego użycia. Nie stanowi to problemu, jeśli jest prywatny, ponieważ nadal można połączyć się z prywatnym konstruktorem. Po prostu uniemożliwiasz dostęp do źródeł zewnętrznych.

private MyClass() 
{ 
} 

public MyClass(string something) : this() 
{ 
} 

To rozwiązuje problem. Należy jednak pamiętać, że ochrona może być preferowaną implementacją, jeśli klasa nie jest zaplombowana.

Powiązane problemy