C# 클래스가 특정 정적 함수를 구현하도록 강요하는 방법이 있습니까?

StackOverflow https://stackoverflow.com/questions/577749

문제

나는 일련의 수업을 개발하고 있습니다 공통 인터페이스를 구현합니다. 내 도서관의 소비자는 이러한 각 클래스가 특정 정적 함수 세트를 구현할 것을 기대해야합니다. 어쨌든 컴파일러가 함수 중 하나가 구현되지 않은 경우를 잡을 수 있도록이 클래스를 장식 할 수 있는가?

나는 소비 코드를 구축 할 때 결국 잡히는 것을 알고 있습니다. 그리고 나는 또한 일종의 공장 수업을 사용 하여이 문제를 해결하는 방법을 알고 있습니다.

클래스에 정적 함수를 요구하기 위해 구문/속성이 있는지 궁금합니다.

에드 혼란을 피하기 위해 '인터페이스'라는 단어를 제거했습니다.

도움이 되었습니까?

해결책

아니요, C#에는 이에 대한 언어 지원이 없습니다. 즉시 생각할 수있는 두 가지 해결 방법이 있습니다.

  • 런타임에 반사를 사용하십시오. 교차 손가락과 희망 ...
  • 싱글 톤 / 기본 인스턴스 / 유사한 방법을 사용하여 방법을 선언하는 인터페이스를 구현하십시오.

(업데이트)

실제로, 단위 테스트가있는 한, 첫 번째 옵션은 실제로 (나처럼) 엄격한 "정적 타이핑"배경에서 나온다고 생각하는 것만 큼 나쁘지 않습니다. 사실은; 역동적 인 언어로 잘 작동합니다. 그리고 실제로 이것은 정확히 내 방식입니다 일반 운영자 코드 작동 - It 희망 정적 연산자가 있습니다. 런타임에, 그렇지 않으면 적절하게 조롱하는 톤으로 당신을 비웃을 것입니다 ... 그러나 컴파일 타임에 확인할 수는 없습니다.

다른 팁

아니요. 기본적으로 일종의 "정적 다형성"을 겪은 것처럼 들립니다. C#에는 존재하지 않지만 일종의 것을 제안했습니다. 제네릭 측면에서 유용 할 수있는 "정적 인터페이스"개념.

당신이 한 가지 ~할 수 있었다 DO는 특정 어셈블리의 모든 유형이 귀하의 규칙에 순종하는지 확인하기 위해 간단한 단위 테스트를 작성하는 것입니다. 다른 개발자가 인터페이스를 구현하는 경우 해당 테스트 코드를 공통 장소에 넣어 인터페이스를 구현하는 모든 사람이 자신의 어셈블리를 쉽게 테스트 할 수 있습니다.

이것은 위대한 질문이며 내 프로젝트에서 발생한 질문입니다.

어떤 사람들은 유형이 특정 방법을 구현하도록 강요하는 것이 아니라 다형성에 대해서만 인터페이스와 추상 클래스가 존재한다고 주장합니다. 개인적으로, 나는 다형성을 1 차 사용 사례로 간주하고, 강제 구현을 보조로 간주합니다. 강제 구현 기술을 상당히 자주 사용합니다. 일반적으로 템플릿 패턴을 구현하는 프레임 워크 코드에 나타납니다. 기본/템플릿 클래스는 몇 가지 복잡한 아이디어를 캡슐화하고 서브 클래스는 추상 방법을 구현하여 수많은 변형을 제공합니다. 실용적인 이점 중 하나는 추상 방법이 하위 클래스를 구현하는 다른 개발자에게 지침을 제공한다는 것입니다. Visual Studio는 심지어 메소드를 스터브 할 수 있습니다. 이는 유지 보수 개발자가 몇 달 또는 몇 년 후에 새로운 서브 클래스를 추가해야 할 때 특히 유용합니다.

단점은 C#에서 이러한 템플릿 시나리오 중 일부에 대한 구체적인 지원이 없다는 것입니다. 정적 방법은 하나입니다. 다른 하나는 생성자입니다. 이상적으로는, Iserializable은 개발자가 보호 된 직렬화 생성자를 구현하도록 강요해야합니다.

가장 쉬운 접근법은 아마도 (앞서 제안 된 바와 같이) 자동 테스트를 사용하여 정적 메소드가 원하는 유형에서 구현되었는지 확인하는 것입니다. 이미 언급 한 또 다른 실행 가능한 아이디어는 정적 분석 규칙을 구현하는 것입니다.

세 번째 옵션은 다음과 같은 측면 지향 프로그래밍 프레임 워크를 사용하는 것입니다. 포스트 쇼트. PostSharp는 측면의 컴파일 타임 검증을 지원합니다. 컴파일 시간에 어셈블리를 반영하는 .NET 코드를 작성하여 임의의 경고 및 오류를 생성 할 수 있습니다. 일반적으로 측면 사용법이 적절하다는 것을 확인하기 위해이 작업을 수행하지만 템플릿 규칙을 검증하는 데 사용 할 수없는 이유는 모르겠습니다.

불행히도, 아니, 언어에 내장 된 것은 없습니다.

이에 대한 언어 지원은 없지만 정적 분석 도구를 사용하여 시행 할 수 있습니다. 예를 들어, 클래스에서 속성 또는 인터페이스 구현을 감지 한 다음 특정 정적 메소드의 존재를 확인하는 FXCOP에 대한 사용자 정의 규칙을 작성할 수 있습니다.

싱글 톤 패턴이 모든 경우에 도움이되지는 않습니다. 내 예는 내 실제 프로젝트에서 나온 것입니다. 그것은 고안되지 않았습니다.

제 3 자 ORM의 수업에서 상속되는 수업 ( "위젯"이라고 부르겠습니다)이 있습니다. 정적 메소드가 선언되도록 위젯 객체 (따라서 DB에서 행을 생성) 인스턴트를 인스턴스화하면 정리하려는 것보다 더 큰 혼란을 겪고 있습니다.

데이터 저장소 에서이 추가 객체를 만들면 사용자, 계산 등에서 숨겨야합니다.

C#의 인터페이스를 사용하여 클래스 세트에서 공통 기능을 구현해야합니다.

이러한 기능을 구현하는 일부 방법은 인스턴스 데이터를 실행해야합니다. 이 방법을 인스턴스 방법으로 코딩하고 C# 인터페이스를 사용하여 클래스에 존재하는지 확인합니다.

이러한 방법 중 일부에는 인스턴스 데이터가 필요하지 않으므로 정적 메소드입니다. 정적 메소드가있는 인터페이스를 선언 할 수 있다면 컴파일러는 클래스에 이러한 메소드가 존재하는지 여부를 확인할 수 있습니다.

아니요,이 기능에는 아무런 의미가 없습니다. 인터페이스는 기본적으로 다중 상속의 스케일 다운 형태입니다. 그들은 컴파일러에게 가상 함수 테이블을 설정하는 방법을 알려 주므로 비 정적 가상 메소드가 자손 클래스에서 올바르게 호출 될 수 있습니다. 정적 메소드는 가상이 될 수 없으므로 인터페이스를 사용하는 데 아무런 의미가 없습니다.

Marc Gravell이 제안한 것처럼 당신이 필요한 것에 더 가까이 다가가는 접근법은 싱글 톤입니다.

인터페이스는 무엇보다도 클래스에 어떤 수준의 추상화를 제공 할 수 있도록하여 구현하는 유형에 관계없이 주어진 API를 사용할 수 있습니다. 그러나 정적 클래스의 유형을 사용하려면 정적 클래스의 유형을 알아야하므로 왜 해당 클래스를 시행하여 기능 세트를 구현 하시겠습니까?

lemplementsxxxxinterface]와 같은 사용자 정의 속성을 사용 하고이 속성의 클래스가 실제로 필요한 인터페이스를 구현할 수 있도록 약간의 실행 시간 확인을 제공 할 수 있습니까?

컴파일러 오류가 발생한 직후 에이 설정을 고려하십시오.

  1. 인터페이스에서 메소드를 정의합니다.
  2. 방법을 초록으로 선언하십시오.
  3. 공개 정적 메소드를 구현하고 추상 방법을 무시하면 간단히 정적 메소드를 호출하십시오.

약간의 추가 코드이지만 누군가가 필요한 방법을 구현하지 않은시기를 알게 될 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top