2012-01-20 4 views
15

Java에서는 익명 클래스를 사용하여 인터페이스를 확장 할 수 있습니다. 예 :C# 익명으로 인터페이스 (또는 추상 클래스)를 구현

Runnable myRunnable = new Runnable() 
{ 
    @Override 
    public void run() { /**/ } 
} 

(ON 외 : http://www.techartifact.com/blogs/2009/08/anonymous-classes-in-java.html#ixzz1k07mVIeO)

C#이 가능한가? 그렇지 않다면, 과다한 서브 클래스를 구현할 필요없이 실행할 수있는 대안은 무엇입니까?

답변

14

아니요, C#에서는 할 수 없지만 은 일반적으로입니다. 대체 디자인 방법은 대신 대리인을 사용하는 것입니다. 예에서 당신이 Runnable 보통 ThreadStart를 사용하여 표현되는, 준, 당신은 익명 메서드 또는 람다 식 사용할 수 있습니다 : 당신은 그냥 실행하는 방법이있는 경우 올바른 서명,

ThreadStart start =() => 
{ 
    // Do stuff here 
}; 

을 또는, 당신은 할 수

ThreadStart start = MethodToRunInThread; 

또는 Thread 생성자 호출 : : 방법 그룹 변환을 사용

Thread t = new Thread(MethodToRunInThread); 
t.Start(); 

당신이 만약 정말 인터페이스를 구현해야합니다. 실제로 구현하면됩니다 (개인 중첩 클래스에있을 수도 있음). 그러나 C#에서는 대개 C#에서 그다지 성능이 향상되지 않습니다. 일반적으로 C# 인터페이스는 Java에서도 자연스럽게 "실제"구현을 요구합니다.

+1

이것은 종종 인터페이스가 좁은 (역할 인터페이스) 인터페이스 분리 원칙을 따르기 때문에 때때로 누락되는 기능입니다. DI 구성에서 대리인을 등록 할 수 있으면 편리 할 것입니다. 나머지 응용 프로그램은 해당 대리인을 래핑하는 일종의 프록시 클래스를 만들지 않고도 ('Func '대신) 해당 인터페이스에 의존 할 수 있습니다. 해당 인터페이스를 구현할 수 있습니다. – Steven

6

존 (Jon)은 C#에서는 이것을 사용할 수 없다고 지적했습니다.

C#에서 하나의 대체 패턴은 인터페이스의 구현을 즉시 수행 할 수 있도록 팩토리와 델리게이트의 조합을 사용하는 것입니다. 본질적으로 팩토리는 인터페이스의 각 메소드에 대한 델리게이트를 가져와이를 백업 구현으로 사용합니다. 예를 들어 IComparable<T>의 버전이 있습니다.

+0

아주 멋지다, +1! 그러나 좋은 연습으로, 명명 된 클래스를 롤하는 것이 좋습니다. – nawfal

관련 문제