C # 및 C ++ / CLI에서 키워드 sealed
(또는 NotInheritable
VB)는 상속 가능성으로부터 클래스를 보호하는 데 사용됩니다 (클래스는 상속 할 수 없음). 객체 지향 프로그래밍의 한 기능이 상속이라는 것을 알고 있으며이 기능을 사용하는 sealed
것이 상속을 중단한다고 생각합니다. 이점 sealed
과 사용이 중요한시기 를 보여주는 예가 있습니까?
답변:
보안 기능을 구현하는 클래스에서 원본 개체를 "가장"할 수 없습니다.
좀 더 일반적으로, 나는 최근에 마이크로 소프트의 한 사람과 교환을했는데, 그 사람은 치료하지 않고 방치하면 성능면에서 비용이 많이 들기 때문에 상속을 완전히 의미가있는 곳으로 제한하려한다고 말했습니다.
봉인 된 키워드는 CLR에 메서드를 찾을 수있는 클래스가 더 이상 없음을 알려주며 속도를 높입니다.
요즘 시장에 나와있는 대부분의 성능 향상 도구에는 상속되지 않은 모든 클래스를 봉인하는 확인란이 있습니다.
그러나 MEF를 통해 플러그인 또는 어셈블리 검색을 허용하려는 경우 문제가 발생하므로주의하십시오.
Baboon의 탁월한 답변에 대한 부록 :
관련 메모에서 봉인되지 않은 클래스에만 적용 할 수 있습니다. 생성 된 모든 메서드 virtual
는 확장 점이거나 적어도 확장 점이어야하는 것처럼 보입니다. 방법 virtual
을 선언 하는 것도 의식적인 결정이어야합니다. (C #에서는 의식적인 결정이지만 Java에서는 그렇지 않습니다.)
편집 : 일부 관련 링크 :
또한 Kotlin 은 기본적으로 클래스를 봉인합니다. 그 open
키워드는 자바의 반대 final
또는 sealed
C #의 . (확실히 이것이 좋은 일이라는 보편적 인 합의는 없습니다 .)
수업을 다음으로 표시 Sealed
보안을 손상 시키거나 성능에 영향을 미칠 수있는 중요한 클래스의 변조 방지 할 수 있습니다.
여러 번, 클래스 봉인은 우리가 변경하고 싶지 않은 고정 된 동작을 가진 유틸리티 클래스를 디자인 할 때도 의미가 있습니다.
예를 들어 System
네임 스페이스 in C#
은 String
. 봉인되지 않으면 기능을 확장 할 수 있으며, 이는 주어진 기능을 가진 기본 유형이므로 바람직하지 않을 수 있습니다.
마찬가지로 structures
in C#
은 항상 암시 적으로 봉인됩니다. 따라서 하나의 구조 / 클래스를 다른 구조에서 파생시킬 수 없습니다. 그 이유는 우리가 수정하고 싶지 않은 독립형, 원자 적, 사용자 정의 데이터 유형만 structures
을 모델링하는 데 사용되기 때문 입니다.
때로는 클래스 계층 구조를 구축 할 때 도메인 모델 또는 비즈니스 규칙에 따라 상속 체인의 특정 분기를 제한 할 수 있습니다.
예를 들어, a Manager
와 PartTimeEmployee
모두 Employee
s이지만 조직의 파트 타임 직원 이후에는 역할이 없습니다. 이 경우 PartTimeEmployee
추가 분기를 방지하기 위해 밀봉 할 수 있습니다 . 반면에 시간제 또는 주간 파트 타임 직원이있는 경우에서 상속하는 것이 합리적 일 수 있습니다 PartTimeEmployee
.
unseal
나중에 클래스를 봉인하고 종속 된 모든 클래스를 깨뜨리는 것보다 필요한 경우 나중에 클래스 에 추가 하는 것이 더 쉽습니다 .
이 게시물에는 좋은 점이 있다고 생각합니다. 특별한 경우는 봉인되지 않은 클래스를 임의의 인터페이스로 캐스팅하려고 할 때 컴파일러에서 오류를 발생시키지 않습니다. 그러나 봉인을 사용하면 컴파일러에서 변환 할 수 없다는 오류가 발생합니다. 봉인 된 클래스는 추가적인 코드 액세스 보안을 제공합니다.
https://www.codeproject.com/Articles/239939/Csharp-Tweaks-Why-to-use-the-sealed-keyword-on-cla