2009-09-08 5 views
6

IList 인터페이스에는 Add 메서드가 필요합니다. 배열은이 함수를 구현하지만 단순히 NotImplementedException을 던집니다. 이것은 나에게 아주 나쁜 디자인처럼 보입니다.배열이 IList를 지원하는 이유는 무엇입니까?

디자이너가이 작업을 수행 할 때 무엇을 생각하고 있었습니까?

답변

7

ILists는 읽기 전용 일 수 있습니다. 호출자는 요소를 추가 또는 제거하기 전에 IsFixedSize 속성을 테스트하거나 요소를 수정하기 전에 IsReadOnly 속성을 테스트 할 수 있습니다.

배열은 고정 크기 IList입니다.

배열을 목록으로 취급하는 것이 편리 할 수 ​​있습니다. 한 가지 예는 IList를 반환하는 데이터 액세스 메서드를 조롱하는 것입니다. IList로 배열 캐스트를 반환하기 위해 조롱받을 수 있습니다.

+1

실제로 확인해야 할 IsFixedSize 속성입니다. 'IsReadOnly'는 기존 요소를 수정할 수 있기 때문에 배열에 대해'false'가됩니다. 요소를 추가하거나 제거 할 수 없기 때문에'IsFixedSize'는'true'가됩니다. – LukeH

+0

고정 및 읽기 전용 문제를 명확히하기 위해 http://blogs.msdn.com/ericlippert/archive/2009/08/27/what-s-the-difference-between-fixed-and-fixed.aspx – Oliver

+1

@Oliver : 저는 Eric Lippert의 블로그를 좋아합니다.하지만이 기사는 IsFixedSize 또는 IsReadOnly 속성과 전혀 관련이 없습니다. – LukeH

0

다른 객체가 다른 능력을 갖는 것이 일반적이기 때문에 일부 인터페이스에는 일부 구현이지만 전체 구현이 아닌 구성원이 포함됩니다. 가설적인 인터페이스 인 IVehicle의 구현 중 일부가 예고편을 부착 할 수있는 경우 일반적인 패턴은 이 true이거나 NotSupportedException 인 경우 AttachTrailer의 기능을 "예고편 부착 시도"로 정의하는 것입니다. . IVehicle의 모든 구현은 트레일러를 처리 할 수 ​​있는지 여부에 관계없이 위의 사양을 준수 할 수 있습니다.

이 접근법의 장점은 인터페이스의 구현이 다양한 조합에 대해 서로 다른 유형을 정의 할 필요없이 다양한 기능 조합을 제공 할 수 있다는 것입니다. 이 접근법의 또 다른 장점은 Foo이 필요없는 기능을 포함하는 객체를 수신하는 Foo 메소드가 어떤 유형 변환을 필요로하지 않고 해당 기능을 필요로하는 Bar 메소드에 객체를 전달할 수 있다는 것입니다. Foo 없이는 Bar에 필요한 기능을 알지 못합니다. 또 다른 장점은 특정 기능이 필요하지 않은 코드를 쉽게 작성할 수 있지만 존재할 때이를 활용할 수 있다는 것입니다.

그러나이 방법에는 몇 가지 단점이 있습니다. 인터페이스가 모든 속성이나 메서드에 대한 기본 구현을 지정하는 방법은 아직 없습니다. 따라서 예고편을 첨부 할 수없는 IVehicle 구현도 false 속성을 CanAttachTrailer 속성에 반환하고 해당 AttachTrailer 메서드에서 예외를 throw하는 코드를 포함해야합니다. 또한, 인터페이스는 많은 메소드가 구현 될 필요가 없기 때문에, 컴파일러가 제공 할 수없는 유형의 객체를 가진 기능을 필요로하는 함수를 호출하려는 시도에서 거부 할 수있는 방법이 없습니다.

IList<T>을 디자인 할 때 Microsoft는 "옵션 기능 인터페이스"접근 방식의 장점이 단점보다 중요하다고 생각했습니다. 실제로 .net이 인터페이스를 구현하는 클래스가 제공하지 않으려는 멤버의 기본 구현을 연기하는 수단을 제공하면 기본 인터페이스에 많은 선택적 기능을 포함하지 않을 이유가 거의 없습니다. 필요한 기능을 컴파일 타임에 시행 할 수있게하려면 필요한 모든 구성원을 포함하는 기반에서 파생 된 여러 인터페이스를 가질 수 있고 후자의 인터페이스를 구현하는 클래스는 실제로 유용하게 특정 구성원을 구현해야한다고 지정할 수 있습니다. 예를 들어 마이크로 소프트는 임의의 멤버를 추가하지 않고 IList<T>을 상속 받도록 IResizableList<T>을 정의 할 수 있었지만 크기 조정을 허용하지 않는 구현은 후자의 인터페이스를 구현하는 반면에 IList<T> 구현은 후자의 인터페이스를 구현합니다.목록 크기를 조정할 수 있어야하는 코드의 경우 IResizableList<T> (이 경우 배열을 허용하지 않음)을 요구할 수 있으며 목록의 크기를 조정할 필요가없는 코드는 IList<T>을 요구할 수 있습니다. 불행하게도 마이크로 소프트는 그렇게하지 않았기 때문에 코드가 컴파일시에 크기를 조정할 수있는 목록을 요구하는 것은 불가능합니다. 전달 된 목록이 자신을 고정 크기로보고하면 할 수있는 일은 모두 스 쿼크입니다.

관련 문제