[c#] 언제 그리고 왜 수업을 봉인 하시겠습니까?

C # 및 C ++ / CLI에서 키워드 sealed(또는 NotInheritableVB)는 상속 가능성으로부터 클래스를 보호하는 데 사용됩니다 (클래스는 상속 할 수 없음). 객체 지향 프로그래밍의 한 기능이 상속이라는 것을 알고 있으며이 기능을 사용하는 sealed것이 상속을 중단한다고 생각합니다. 이점 sealed과 사용이 중요한시기 를 보여주는 예가 있습니까?



답변

  1. 보안 기능을 구현하는 클래스에서 원본 개체를 “가장”할 수 없습니다.

  2. 좀 더 일반적으로, 나는 최근에 마이크로 소프트의 한 사람과 교환을했는데, 그 사람은 치료하지 않고 방치하면 성능면에서 비용이 많이 들기 때문에 상속을 완전히 의미가있는 곳으로 제한하려한다고 말했습니다.
    봉인 된 키워드는 CLR에 메서드를 찾을 수있는 클래스가 더 이상 없음을 알려주며 속도를 높입니다.

요즘 시장에 나와있는 대부분의 성능 향상 도구에는 상속되지 않은 모든 클래스를 봉인하는 확인란이 있습니다.
그러나 MEF를 통해 플러그인 또는 어셈블리 검색을 허용하려는 경우 문제가 발생하므로주의하십시오.


답변

Baboon의 탁월한 답변에 대한 부록 :

  1. 클래스가 상속 용으로 설계 되지 않은 경우 하위 클래스가 클래스 불변을 깨뜨릴 수 있습니다 . 물론 이것은 퍼블릭 API를 생성하는 경우에만 실제로 적용되지만, 내가 경험하는 법칙에 따라 명시 적으로 서브 클래 싱하도록 설계되지 않은 모든 클래스를 봉인합니다.

관련 메모에서 봉인되지 않은 클래스에만 적용 할 수 있습니다. 생성 된 모든 메서드 virtual는 확장 점이거나 적어도 확장 점이어야하는 것처럼 보입니다. 방법 virtual을 선언 하는 것도 의식적인 결정이어야합니다. (C #에서는 의식적인 결정이지만 Java에서는 그렇지 않습니다.)


편집 : 일부 관련 링크 :

또한 Kotlin 은 기본적으로 클래스를 봉인합니다. open키워드는 자바의 반대 final또는 sealedC #의 . (확실히 이것이 좋은 일이라는 보편적 인 합의는 없습니다 .)


답변

수업을 다음으로 표시 Sealed 보안을 손상 시키거나 성능에 영향을 미칠 수있는 중요한 클래스의 변조 방지 할 수 있습니다.

여러 번, 클래스 봉인은 우리가 변경하고 싶지 않은 고정 된 동작을 가진 유틸리티 클래스를 디자인 할 때도 의미가 있습니다.

예를 들어 System네임 스페이스 in C#String. 봉인되지 않으면 기능을 확장 할 수 있으며, 이는 주어진 기능을 가진 기본 유형이므로 바람직하지 않을 수 있습니다.

마찬가지로 structuresin C#은 항상 암시 적으로 봉인됩니다. 따라서 하나의 구조 / 클래스를 다른 구조에서 파생시킬 수 없습니다. 그 이유는 우리가 수정하고 싶지 않은 독립형, 원자 적, 사용자 정의 데이터 유형만 structures을 모델링하는 데 사용되기 때문 입니다.

때로는 클래스 계층 구조를 구축 할 때 도메인 모델 또는 비즈니스 규칙에 따라 상속 체인의 특정 분기를 제한 할 수 있습니다.

예를 들어, a ManagerPartTimeEmployee모두 Employees이지만 조직의 파트 타임 직원 이후에는 역할이 없습니다. 이 경우 PartTimeEmployee추가 분기를 방지하기 위해 밀봉 할 수 있습니다 . 반면에 시간제 또는 주간 파트 타임 직원이있는 경우에서 상속하는 것이 합리적 일 수 있습니다 PartTimeEmployee.


답변

이 게시물에는 좋은 점이 있다고 생각합니다. 특별한 경우는 봉인되지 않은 클래스를 임의의 인터페이스로 캐스팅하려고 할 때 컴파일러에서 오류를 발생시키지 않습니다. 그러나 봉인을 사용하면 컴파일러에서 변환 할 수 없다는 오류가 발생합니다. 봉인 된 클래스는 추가적인 코드 액세스 보안을 제공합니다.
https://www.codeproject.com/Articles/239939/Csharp-Tweaks-Why-to-use-the-sealed-keyword-on-cla


답변