별도 dll의 부분 클래스


154

별도의 DLL에서 부분 클래스에 대해 두 부분 (동일한 네임 스페이스, 동일한 클래스 이름)을 가질 수 있습니까?


다른 사람들이 말했듯이 불가능하지만 다른 출처의 새로운 행동으로 클래스를 보완하는 방법이 있습니다. 다른 dll에서 정확히 무엇을하고 싶습니까?
오잔

필자의 경우 타사 라이브러리에 정의 된 클래스에 몇 가지 정적 메서드를 추가하고 싶습니다. 클래스가 정적이므로 확장 메서드가 작동하지 않으며 인터페이스와 상속도 수행되지 않습니다. 부분 정적 클래스를 가질 수 있음을 발견 한 후 어셈블리에서 작동하지만 아쉽게 보이지 않는 것으로 나타났습니다.
Ben

답변:



36

아니요. 부분 수업은 순전히 언어 기능입니다. 어셈블리가 컴파일되면 파일이 결합되어 유형을 만듭니다. 파일을 다른 어셈블리로 펼칠 수 없습니다.

그러나 수행하려는 작업에 따라 확장 방법 을 사용 하여 필요한 작업을 수행 할 수 있습니다.



8

다른 답변이이 페이지에 방문하는 사람이보고 싶거나 원하지 않는 불쾌한 "아니오"를 제공하지만, 아직 여기에 언급되지 않은 다른 생각에 감동했습니다. 어셈블리에서 부분 클래스가 허용 된 경우, 자신이 작성하지 않은 기존 유형의 개인 멤버에 액세스하여 원래 작성자가 의도하지 않은 방식으로 조작 할 수 있으므로 모든 상속 클래스의 기능이 손상됩니다. 너무.

뿐만 아니라 다른 어셈블리 (및 해당 자식)의 클래스는 다시 컴파일해야 작동합니다. 따라서 논리적으로 클래스를 다른 어셈블리로 분할 할 수 없습니다.


실제로 필요한 경우 리플렉션을 통해 개인 회원을 쉽게 엉망으로 만들 수 있습니다. 순환 참조는 허용되지 않으며 클래스의 다른 부분이 상호 작용하기 위해 필요하므로 어셈블리간에 클래스를 분할 할 수 없습니다.
Zar Shardan 22시 01 분

6

다른 dll의 클래스에 메소드를 추가하려는 경우 확장 메소드를 사용할 수 있습니다. 이 메소드의 한 가지 단점은 정적 메소드를 추가 할 수 없다는 것입니다.


3

문제는 왜 다른 어셈블리에서 부분 클래스를 만들고 싶습니까? 어셈블리 전체에서 추상 클래스와 인터페이스를 정의 할 수 있습니다.


10
다음과 같은 경우에 유효한 경우가 있습니다. 다른 어셈블리에 정의 된 모델 클래스에 MVC 양식 주석을 추가 할 수 있습니다. 어셈블리 자체는 어떤 컨텍스트에서 사용되는지 알지 못하므로 어셈블리의 클래스에는 주석이 없어야합니다. 그러나 MVC 컨텍스트에서 부분 클래스로 추가 될 수 있습니다 (가능한 경우).
nyi

3
그래, 왜 그 클래스에서 상속하고 속성을 맨 위에 선언하지 않습니까? 원하는 경우 동일한 이름으로 호출 할 수도 있습니다.
Gleno

0

아마도 자신의 라이브러리 내에서, 제 3 부분 라이브러리의 클래스 주위에 래퍼 클래스를 만들고 싶을 것입니다. 그런 다음 랩퍼 클래스에 기능을 추가하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.