C# 및 C++/CLI에서 키워드 sealed
(또는 VB에서는 NotInheritable
)은 상속 기회로부터 클래스를 보호하는 데 사용됩니다 (클래스는 상속 불가). 오브젝트 지향 프로그래밍의 한 기능은 상속이며, sealed
의 사용이이 기능에 반대한다고 생각합니다. 상속을 중지합니다. sealed
의 이점과 이점을 보여주는 예제가 있습니까?수업을 언제 그리고 왜 봉쇄합니까?
답변
1) 보안 기능을 구현하는 클래스에서 원본 개체를 "가장 할 수 없도록".
2) 더 일반적으로, 나는 마이크로 소프트에서 최근 상속을 완전히 감당할 수있는 곳으로 제한하려고 시도했다고 말했고, 치료를받지 않으면 값 비싼 성과를 얻게됩니다.
봉인 된 키워드는 CLR에 메서드를 찾기위한 클래스가 더 이상 없다는 것을 알려주며이를 통해 작업 속도가 향상됩니다.
현재 시장에 나와있는 대부분의 성능 향상 도구에서 상속되지 않은 모든 클래스를 봉인하는 확인란을 찾을 수 있습니다.
MEF를 통해 플러그인 또는 어셈블리 검색을 허용하려면 문제가 발생할 수 있으므로주의하십시오.
원숭이의 훌륭한 대답 부록 :
3) 클래스가 상속을 설계되지 경우, 서브 클래스는 class invariants을 깰 수 있습니다. 물론 이것은 공개 API를 만드는 경우에만 적용됩니다.하지만 엄지 손가락의 규칙에 따라 명시 적으로 서브 클래 싱되지 않도록 지정된 클래스를 봉인합니다.
봉인 된 클래스에만 적용 : virtual
으로 작성된 모든 메서드는 확장 점이거나 적어도 확장 점이어야하는 것처럼 보입니다. 선언 방법 virtual
도 의식적인 결정이어야합니다. (C#에서이 의식적인 결정이며, 자바가 없습니다.)
편집 : 일부 관련 링크 : 여호수아 블로흐
- Effective Java, 2nd Edition. 항목 17을 참조하십시오
- Effective Java Item 17: Design and document for inheritance or else prohibit it (동일한 항목에 대한 논의)
이 또한주의 (사파리 가입이 필요합니다) 그 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.)
씰링 클래스는 이점보다 두통을 유발합니다. 개발자가 수업을 봉인 한 상황을 지속적으로 발견하여 단순해야하는 작업에 몇 시간의 어려움을 겪었습니다. 씰링 클래스를 중단하면 생각만큼 재치가 없습니다. 반드시 인과 관계 수업을 인계해야하며, 그렇다고하더라도 다시 고려해야합니다. 다른 사람들의 봉인 된 수업을 다루어야하는 사람으로서, 편집/봉인을 할 수 없다는 제 의견입니다. – GantMan
@GantMan의 의견은 OP의 질문에 대한 답변 중 하나로 간주되어야합니다. 왜냐하면 "본질적으로, 언제, 왜, 이것이 당신이 그렇게하지 않는 이유입니까?"라고 대답하기 때문입니다. 부여 된 답변을 분리 된 대답으로 다시 게시 한 다음 투표를 수집해야합니다. :-) – RayLuo
나는이 포스트가 어떤 특별한 점을 가지고 있다고 생각한다. 특정 사례는 임의의 인터페이스에 대해 비 밀폐 된 클래스를 형 변환하려 할 때였 다. 컴파일러는 에러를 던지지 않는다. 그러나 sealed가 사용되면 컴파일러는 변환 할 수없는 오류를 throw합니다. Sealed 클래스는 추가적인 코드 액세스 보안을 제공합니다.
https://www.codeproject.com/Articles/239939/Csharp-Tweaks-Why-to-use-the-sealed-keyword-on-cla
솔루션에 대한 링크는 환영합니다. 그러나 링크가없는 상황에서도 유용한 답변을 제공하십시오. (// meta.stackexchange.com/a/8259) 동료 사용자가 아이디어를 얻을 수 있도록하십시오. 그것이 무엇이고 왜 그것이 존재하는지, 목표 페이지를 사용할 수 없을 때 링크하려는 페이지의 가장 중요한 부분을 인용하십시오. [링크보다 조금 더 많은 답변은 삭제 될 수 있습니다.] (// stackoverflow.com/help/deleted-answers) –
죄송합니다. 답변으로 게시하지 않으려했지만 다른 답변과 관련이없는 것 같습니다. 그것을 어디에 넣어야할지 모르겠다. – strisunshine
나는 제안에 따라 글을 편집했다. 원래 나는 다른 각도 (아마도)를 기여하고 싶습니다만, 나는 downvote를 가지고 있었고 우리는 내용에 대해 아직 이야기하지 않았습니다. -1이 이유를 알 수 있습니까? – strisunshine
- 1. autoRelease. 왜 그리고 언제?
- 2. Java UnknownHostException 언제 그리고 왜?
- 3. 언제 그리고 왜 객체를 해제해야합니까?
- 4. 언제 그리고 왜 COM을 사용해야합니까?
- 5. 언제 수업을 정의합니까?
- 6. 정적 수업을 언제 시작해야합니까?
- 7. JavaScript를 통한 JQuery 왜 그리고 언제 사용합니까?
- 8. NSUserDefaults의 동기화 메서드가 언제 그리고 왜 실패합니까?
- 9. 언제 그리고 왜 객체를 놓아야 하는가?
- 10. 왜 CGI와 PHP가 필요합니까? 그리고 언제?
- 11. CSS에서는 언제 id를 사용해야하며 언제 수업을 사용해야합니까?
- 12. 로깅, 언제 그리고 무엇?
- 13. 왜, 언제
- 14. 언제 그리고 왜 sprintf가 실패 할 수 있습니까?
- 15. Javascript 메서드 인 CollectGarbage()는 무엇입니까? 언제 그리고 왜 사용해야합니까?
- 16. DWORD_PTR, INT_PTR, LONG_PTR, UINT_PTR, ULONG_PTR 언제, 어떻게 그리고 왜?
- 17. DragDetect는 언제 그리고 어떻게 유용합니까?
- 18. 다음 코드는 파이썬에서 (그리고 왜)
- 19. NameSpaces 언제, 어디서, 왜!
- 20. 왜 전체 수업을 봉인/마지막으로 하시겠습니까?
- 21. 언제 인덱서를 사용합니까? 그리고 쓰는 방법을 알아야합니다.
- 22. 속성은 언제 그리고 얼마나 자주 파이썬에서 계산됩니까?
- 23. 언제 그리고 어떤 시나리오를 사용해야합니까? Expression Tree
- 24. 언제 UITableView reloadData를 사용해야합니까? 그리고 관련된 결함;)
- 25. 주입 공장 - 어떻게 그리고 왜?
- 26. 왜 그리고 어디에서 해시를 사용합니까?
- 27. 자바 동기화는 언제, 왜 필요합니까?
- 28. 언제, 왜 System.ComponentModel.Container 클래스를 사용해야합니까?
- 29. 언제 발생합니까? 그리고 왜? Android 앱 활동 종료 중 오류 2.334 에뮬레이터
- 30. 내가이 수업을
봉인 된 클래스를 사용하는 경우 왜 MEF에 문제가 있습니까? –
재사용 된 라이브러리에서 클래스를 씰링 할 때주의해야합니다. 특히 제 3자가 재사용 할 수 있다면 (MEF를 통해) 코드베이스로 다시 통합해야합니다. 귀하의 코드베이스는 주어진 클래스를 상속받을 수는 없지만 제 3 자들은 상속받습니다. –
# 1이 막연한 것처럼 보입니다. 그러나 대부분의 경우 "보안 기능"을 쓰지 않는다고 가정하면 # 1 이유는 거의 적용되지 않습니다. 이유 2는 성능 조정을위한 것입니다.성능 차이는 얼마나됩니까? 비보안 클래스의 정의를 변경하는 것을 정당화 할만큼 충분히 중요합니까? 대답이 "예"일지라도 개발자가 코드 기반을 변경하는 대신 컴파일 된 옵션, 즉 "모든 비 밀폐 클래스에 최적화 된 코드 생성"이 이상적입니다. – RayLuo