2011-10-15 3 views
51

C# 및 C++/CLI에서 키워드 sealed (또는 VB에서는 NotInheritable)은 상속 기회로부터 클래스를 보호하는 데 사용됩니다 (클래스는 상속 불가). 오브젝트 지향 프로그래밍의 한 기능은 상속이며, sealed의 사용이이 기능에 반대한다고 생각합니다. 상속을 중지합니다. sealed의 이점과 이점을 보여주는 예제가 있습니까?수업을 언제 그리고 왜 봉쇄합니까?

답변

62

1) 보안 기능을 구현하는 클래스에서 원본 개체를 "가장 할 수 없도록".

2) 더 일반적으로, 나는 마이크로 소프트에서 최근 상속을 완전히 감당할 수있는 곳으로 제한하려고 시도했다고 말했고, 치료를받지 않으면 값 비싼 성과를 얻게됩니다.
봉인 된 키워드는 CLR에 메서드를 찾기위한 클래스가 더 이상 없다는 것을 알려주며이를 통해 작업 속도가 향상됩니다.

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

+0

봉인 된 클래스를 사용하는 경우 왜 MEF에 문제가 있습니까? –

+3

재사용 된 라이브러리에서 클래스를 씰링 할 때주의해야합니다. 특히 제 3자가 재사용 할 수 있다면 (MEF를 통해) 코드베이스로 다시 통합해야합니다. 귀하의 코드베이스는 주어진 클래스를 상속받을 수는 없지만 제 3 자들은 상속받습니다. –

+0

# 1이 막연한 것처럼 보입니다. 그러나 대부분의 경우 "보안 기능"을 쓰지 않는다고 가정하면 # 1 이유는 거의 적용되지 않습니다. 이유 2는 성능 조정을위한 것입니다.성능 차이는 얼마나됩니까? 비보안 클래스의 정의를 변경하는 것을 정당화 할만큼 충분히 중요합니까? 대답이 "예"일지라도 개발자가 코드 기반을 변경하는 대신 컴파일 된 옵션, 즉 "모든 비 밀폐 클래스에 최적화 된 코드 생성"이 이상적입니다. – RayLuo

7

원숭이의 훌륭한 대답 부록 :

3) 클래스가 상속을 설계되지 경우, 서브 클래스는 class invariants을 깰 수 있습니다. 물론 이것은 공개 API를 만드는 경우에만 적용됩니다.하지만 엄지 손가락의 규칙에 따라 명시 적으로 서브 클래 싱되지 않도록 지정된 클래스를 봉인합니다.

봉인 된 클래스에만 적용 : virtual으로 작성된 모든 메서드는 확장 점이거나 적어도 확장 점이어야하는 것처럼 보입니다. 선언 방법 virtual도 의식적인 결정이어야합니다. (C#에서이 의식적인 결정이며, 자바가 없습니다.)


편집 : 일부 관련 링크 : 여호수아 블로흐

이 또한주의 (사파리 가입이 필요합니다) 그 Kotlin 씰 기본적으로 클래스; its open keyword is the opposite of Java's final or the sealed of C#. (확실하게, there is no universal agreement that this is a good thing.)

+8

씰링 클래스는 이점보다 두통을 유발합니다. 개발자가 수업을 봉인 한 상황을 지속적으로 발견하여 단순해야하는 작업에 몇 시간의 어려움을 겪었습니다. 씰링 클래스를 중단하면 생각만큼 재치가 없습니다. 반드시 인과 관계 수업을 인계해야하며, 그렇다고하더라도 다시 고려해야합니다. 다른 사람들의 봉인 된 수업을 다루어야하는 사람으로서, 편집/봉인을 할 수 없다는 제 의견입니다. – GantMan

+2

@GantMan의 의견은 OP의 질문에 대한 답변 중 하나로 간주되어야합니다. 왜냐하면 "본질적으로, 언제, 왜, 이것이 당신이 그렇게하지 않는 이유입니까?"라고 대답하기 때문입니다. 부여 된 답변을 분리 된 대답으로 다시 게시 한 다음 투표를 수집해야합니다. :-) – RayLuo

-1

나는이 포스트가 어떤 특별한 점을 가지고 있다고 생각한다. 특정 사례는 임의의 인터페이스에 대해 비 밀폐 된 클래스를 형 변환하려 할 때였 다. 컴파일러는 에러를 던지지 않는다. 그러나 sealed가 사용되면 컴파일러는 변환 할 수없는 오류를 throw합니다. Sealed 클래스는 추가적인 코드 액세스 보안을 제공합니다.
https://www.codeproject.com/Articles/239939/Csharp-Tweaks-Why-to-use-the-sealed-keyword-on-cla

+1

솔루션에 대한 링크는 환영합니다. 그러나 링크가없는 상황에서도 유용한 답변을 제공하십시오. (// meta.stackexchange.com/a/8259) 동료 사용자가 아이디어를 얻을 수 있도록하십시오. 그것이 무엇이고 왜 그것이 존재하는지, 목표 페이지를 사용할 수 없을 때 링크하려는 페이지의 가장 중요한 부분을 인용하십시오. [링크보다 조금 더 많은 답변은 삭제 될 수 있습니다.] (// stackoverflow.com/help/deleted-answers) –

+0

죄송합니다. 답변으로 게시하지 않으려했지만 다른 답변과 관련이없는 것 같습니다. 그것을 어디에 넣어야할지 모르겠다. – strisunshine

+0

나는 제안에 따라 글을 편집했다. 원래 나는 다른 각도 (아마도)를 기여하고 싶습니다만, 나는 downvote를 가지고 있었고 우리는 내용에 대해 아직 이야기하지 않았습니다. -1이 이유를 알 수 있습니까? – strisunshine

관련 문제