Po co zamykać zajęcia?

Chciałbym usłyszeć, jaka jest motywacja stojąca za większością zamkniętych klas w. Net framework. Jakie są korzyści z uszczelniania klasy? Nie mogę pojąć, jak nie dopuszczanie do dziedziczenia może być przydatne i najprawdopodobniej nie jedyne walczące z tymi klasami.

Więc, dlaczego framework jest tak zaprojektowany i czy nie byłoby niezniszczalną zmianą, aby otworzyć wszystko? Musi być inny powód, ale tylko bycie złym?

Author: mmiika, 2008-11-06

10 answers

  • Czasami klasy są zbyt cenne i nie są przeznaczone do dziedziczenia.
  • Runtime / Reflection może tworzyć założenia dziedziczenia dotyczące zamkniętych klas podczas wyszukiwania typów. Doskonałym tego przykładem jest-atrybuty powinny być zapieczętowane dla szybkości uruchamiania wyszukiwania. Typ.GetCustomAttributes (typeof (MyAttribute)) będzie działać znacznie szybciej, jeśli myattribute jest zapieczętowany.

Artykuł MSDN na ten temat to ograniczenie rozszerzalności poprzez uszczelnienie Klasy .

 38
Author: CVertex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-06 10:46:32

Klasy powinny być albo przeznaczone do dziedziczenia, albo zabronić tego. Istnieje koszt zaprojektowania dziedziczenia:

  • może przypiąć Twoją implementację (musisz zadeklarować, które metody będą wywoływać inne metody, w przypadku, gdy użytkownik nadpisuje jedną, ale nie drugą)
  • ujawnia Twoją implementację, a nie tylko efekty
  • oznacza to, że musisz myśleć o większych możliwościach przy projektowaniu
  • rzeczy takie jak równi są trudne do zaprojektowania w drzewo dziedziczenia
  • wymaga większej dokumentacji
  • Typ niezmienny, który jest podklasowany może stać się zmienny (ick)

Punkt 17 Effective Java wchodzi w szczegóły na ten temat - niezależnie od tego, że jest napisane w kontekście Javy, porady dotyczą również. NET.

Osobiście chciałbym, aby klasy były domyślnie zamknięte w .NET.

 93
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-06 11:09:38

[1]} wydaje się, że oficjalne wytyczne Microsoftu dotyczące uszczelniania ewoluowały od tego pytania zadanego ~9 lat temu i przeszły z filozofii opt-in (domyślnie pieczęć) do opt-out (domyślnie nie pieczęć):

X nie klas pieczęci bez dobrego powodu do tego.

Zamykanie klasy, ponieważ nie można wymyślić scenariusza rozszerzalności to nie jest dobry powód. Użytkownicy frameworków lubią dziedziczyć po klasach dla różne nieoczywiste powody, takie jak dodawanie członków wygody. Zobacz też Niezabezpieczone klasy dla przykładów nieoczywistych powodów, dla których użytkownicy chcą dziedziczenie z rodzaju.

Dobre powody dla uszczelnienia klasy to:

  • klasa jest klasą statyczną. Zobacz Statyczne Projektowanie Klas.
  • klasa przechowuje poufne sekrety w odziedziczonych chronionych członkach.
  • klasa dziedziczy wiele wirtualnych członków i koszt ich zapieczętowania indywidualnie przewyższa korzyści z opuszczenia klasy rozpieczętowane.
  • klasa jest atrybutem wymagającym bardzo szybkiego uruchamiania poszukaj. Uszczelnione atrybuty mają nieco wyższy poziom wydajności niż niezabezpieczone. Zobacz Atrybuty.

X nie deklaruje chronionych lub wirtualnych członków na zamkniętych typach.

Z definicji typy zamknięte nie mogą być dziedziczone. Oznacza to, że protected members on sealed types cannot be called, and virtual metody na uszczelnionych typach nie można go przesłonić.

✓ rozważ uszczelnienie członków, które nadpisałeś. Problemy, które mogą wynikać z wprowadzenia wirtualnych członków (omówione w Virtual Members) stosuje się również do przesłonięć, choć w nieco mniejszym stopniu. Uszczelnienie obejścia chroni Cię przed tymi problemami począwszy od tego miejsce w hierarchii spadkowej.

Rzeczywiście, jeśli przeszukać ASP.Net Core codebase , Znajdziesz tylko około 30 wystąpień sealed class, większość które są atrybutami i klasami testowymi.

Myślę, że zachowanie niezmienności jest dobrym argumentem na korzyść uszczelnienia.
 5
Author: Ohad Schneider,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-14 11:59:23

Znalazłem to zdanie w dokumentacji msdn: "klasy zamknięte są używane przede wszystkim do zapobiegania derywacji. Ponieważ nigdy nie mogą być używane jako klasy bazowe, niektóre optymalizacje czasu pracy mogą sprawić, że wywołanie zamkniętych członków klasy będzie nieco szybsze."

Nie wiem, czy wydajność jest jedyną zaletą klas zamkniętych i osobiście chciałbym też poznać inne powody ...

 3
Author: bruno conde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-06 10:47:08

Wydajność jest ważnym czynnikiem na przykład, klasa string w Javie jest ostateczna (http://blogs.msdn.com/ericlippert/archive/2004/01/07/virtual-methods-and-brittle-base-classes.aspx

Jeśli udostępniasz framework, ważne jest, aby utrzymać starsze projekty i uaktualnić framework, aby uniknąć kruchej bazy problem klas

 2
Author: Peter Parker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-06 11:07:20

Sealed jest używany, aby zapobiec "problemowi kruchej klasy bazowej". Znalazłem Dobry artykuł w MSDN, który to wyjaśnia.

 1
Author: ihebiheb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-10 00:13:51

Uszczelnienie pozwala na osiągnięcie niewielkich wzrostów wydajności. Jest to mniej prawdziwe w świecie JIT i leniwej pesymizacji niż w świecie, powiedzmy C++, ale ponieważ. NET nie jest tak dobry jak pesymizacja, jak kompilatory Javy są głównie z powodu różnych filozofii projektowania, nadal jest przydatny. Mówi kompilatorowi, że może bezpośrednio wywoływać dowolne metody wirtualne, a nie wywoływać je pośrednio poprzez vtable.

Jest również ważne, gdy chcesz mieć "zamknięty świat" dla takich rzeczy jak porównanie równości. Normalnie, gdy zdefiniuję metodę wirtualną, jestem prawie gotowy do zdefiniowania pojęcia porównania równości, które naprawdę wdraża ideę. Z drugiej strony, mogę być w stanie zdefiniować go dla konkretnej podklasy klasy za pomocą metody wirtualnej. Zapieczętowanie tej klasy zapewnia, że równość naprawdę się trzyma.

 0
Author: Edward KMETT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-06 15:31:08

Uszczelnienie klasy ułatwia zarządzanie jednorazowymi zasobami.

 0
Author: Jeff Dunlop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-04 05:00:59

Aby określić, czy należy uszczelnić klasę, metodę lub właściwość, należy ogólnie wziąć pod uwagę następujące dwa punkty:

* potencjalne korzyści, jakie mogą zyskać klasy wynikające z możliwości dostosowania klasy.

•potencjał, że wyprowadzanie klas może zmodyfikować Twoje klasy w taki sposób, że nie będą już działać poprawnie lub zgodnie z oczekiwaniami.

 0
Author: user3629577,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-01 10:44:37

Kolejną kwestią jest to, że zamknięte klasy nie mogą być używane w testach jednostkowych. Z dokumentacji Microsoftu :

Zamknięte klasy lub statyczne metody nie mogą być stubowane, ponieważ typy stub polegają na wirtualnym wysyłaniu metod. W takich przypadkach użyj typów shim, jak opisano w Using shims, aby odizolować aplikację od innych zespołów do testowania jednostek

 0
Author: Dave Clark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-18 09:20:20