2012-07-27 4 views
0

나는 DataGridsComboBoxes에 콜렉션을 바인딩 할 때 WPF 응용 프로그램에ObservableCollection을 사용했습니다. 그리고 조건에 따라 컬렉션에서 객체를 제거해야하는 요구 사항으로 인해 List과 같이 Extension method을 사용하여 RemoveAll 기능을 구현했습니다.확장 메서드 또는 상속?

This 게시물 Extension methods 이상 Inheritance의 몇 가지 장점을 지정하지만 내가 추가하는 데 필요한 유일한 방법이었고, 나는 컬렉션에 대한 또 다른 Extension method를 추가하지 않으려는 나의 사건에 대한 매우 구체적인하지 않습니다.

내가 이것을 Extension method으로 구현하는 것이 더 좋을지 알고 싶습니다. 또는 클래스를 상속하고이를 Instance method으로 추가해야한다고 생각합니까?

또한 언급 된 게시물에서 논의되지 않았으므로 두 성능 차이가 있는지 알고 싶습니다.

+0

이것은 이름으로'Clear'를 사용하는 것을 고려하고 있습니다. 이것은 목록의 모든 것을 제거하는 것으로 잘 알려져 있기 때문에입니다. 다른 점은 컴파일러가 사용 가능한 경우 (성능면에서 더 좋음) 객체 - 구현을 사용한다는 것입니다. –

+0

음, Clear()는 모든 것을 제거하고 그것이 내 요점이 아닙니다. –

+0

아아, RemoveAll이 predicat-Delegate ...를 사용한다는 사실을 잊어 버렸습니다. 죄송합니다. 절대적으로 맞습니다. –

답변

2

한 가지 방법으로 확장 메서드를 사용합니다. 이 경우 사용자 정의 유형을 유지할 필요없이 코드가 ObservableCollection<T>을 계속 사용할 수 있음을 의미합니다.

확장 메서드는 단순히 컴파일 할 때 정적 메서드 호출로 끝나기 때문에 성능이 상속보다 나쁘다는 것을 상상할 수 없습니다. 무엇이든 그것은 동일하거나 더 좋아야합니다.

개인 선호는 대개 확장 방법의 선택을 좌우합니다.

+0

감사합니다. 이 질문에 대한 답변입니다. +1. –

4

ObservableCollection을 RemoveAll() 이상으로 향상하려는 경우 하위 클래스로 만들고 기능을 추가하십시오. RemoveAll()을 ObservableCollection 이상에 추가하려는 경우 IEnumerable 또는 다른 일반 상위를 계층 구조에서 대신 타겟팅하여 ObservableCollections 이상을 처리하는 확장 메서드를 만들 수 있습니다. 이 메서드에서 컬렉션이 CollectionChanged를 지원하는지 테스트하고 적절하게 처리 할 수 ​​있습니다.

여기서 옳고 그른 대답은 없습니다. 귀하의 필요에 맞는 것이기 때문입니다.

+0

+1 좋은 지적! –

+0

글쎄, 내가 지정한대로, 나는 다른 기능을 추가 할 의도가 없으며, 바인딩을 할 필요가없고 이미 메소드가있을 때 IList를 자주 사용한다. 확장 할 필요가 없다고 생각한다. 이것을 다른 유형으로 변경하십시오.그러나 좋은 지적 (+1)과 나는이 조언을 미래에 사용할지도 모릅니다. –

1

ExtensionMethod를 사용하면 인터페이스를 확장하여 해당 인터페이스의 모든 구현자를 확장 할 수 있습니다.

확장 방법이 System.Collections.IList 인 경우 사용합니다. System.Collections.IList

public class static Extension 
{ 
    public static void RemoveAll(this System.Collections.IList list) 
    { 
     ... 
    } 
} 

이 거의 모든 콜렉션 구현을 확장하는 것입니다 ... 모든 곳에서 사용된다.

+0

글쎄,이 모양이 좋아 보이지만 지금은이 기능을 다른 유형으로 확장 할 필요가 없다고 생각합니다. 그러나 좋은 제안. +1. –