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.
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.
I myśleć które powinny obejmować wszystkie podstawy ...
Powiedziałeś właściwie dokładnie o tym, co właśnie pisałem :) – Joel
Chciałbym wiedzieć o statycznych klasach dawno temu. – luiscubal
, 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. –
Ustaw jako prywatny.
Więc
class SomeClass
{
private SomeClass()
{
}
public SomeClass(int SomeParam)
{
}
}
+1 za punkt. – corsiKa
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. –
@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ę. –
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
}
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.
Oprócz innych odpowiedzi, można przeczytać następujący tekst , aby uzyskać więcej informacji o Singleton wzór i kilka przykładów. Wzór Singleton polega na tym, że konstruktor jest prywatny.
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ć. –