Jak dla mnie perełka, kod broniący się przed programistą - spartanPAGE dzisiaj, 10:37
Tak samo jak modyfikator private
- niby jeśli ktoś się uprze/potrzebuje, można go obejść (w C++ również), ale to bardziej informacja dla programisty "nie dotykaj, szczegół implementacyjny".
Czy jest jakaś możliwość w C#, uniemożliwienie tworzenia obiektów klasy, z wyjątkiem jednej, innej klasy. W C++ mógłbym dać prywatny konstruktor i firend i to załatwiło by sprawę.
- Ogólnie moim zdaniem może myślisz w dobrym kierunku, ale idziesz w złą stronę. Jeśli klasa jest publiczna - mogą ją stworzyć wszyscy. Friend i inne wynalazki tylko tworzą kolejny poziom skomplikowania i niejawne powiązania między klasami, które komplikują sytuację - nie bez powodu ich w końcu w C# nie ma.
- Jeśli martwi Cię kto ma tworzyć ten obiekt - zastanów się na przykład czy jakieś dependency injection by Ci nie ułatwiło sytuacji.
- I ogólnie, nie ma co przesadzać i zakładać że każdy programista piszący kod w Twoim projekcie nic nie robi poza myśleniem jak wprowadzić błędy.
Jeśli chodzi o temat, coś co faktycznie uniemożliwia tworzenie obiektu (pierwsza myśl przynajmniej):
class SecureClass
{
public SecureClass()
{
StackTrace trace = new StackTrace();
StackFrame frame = trace.GetFrame(1); // z jakiej metody został wywołany ten konstruktor
if (frame.GetMethod().DeclaringType != typeof(Ok)) // jeśli metoda jest w złej klasie
{
throw new InvalidOperationException("Nope"); // rzucamy błąd
}
}
}
Ale nie używaj tego, naprawdę (bo to faktycznie kod wrogi programiście, i lista problemów z tym by była tak długa że nawet nie zaczynam pisać).