2012-11-08 2 views
1

으로 인터페이스 속성을 노출 나는 IHedgehog 인터페이스의 IBristles로 고슴도치의 속성 강모를 노출하고 싶습니다 이하 나) 외부 어셈블리 I Bristles가 FindBristleDNA와 같은보다 복잡한 메서드에 사용하는 모든 어셈블리를 참조 할 필요가 없습니다. 내 선택 중 하나입니다패턴 코드에서 인터페이스

// straightforward interface for simple properties of Bristles -- 
// more complicated methods not exposed 
public interface IBristles { 
    int Quantity{ get; } 
} 
public class Bristles : IBristles {   

    public int Quantity{ get; set; } 
    public MyObscureAssembly.ComplicatedObject FindBristleDNA(){ ... } 
} 

// simple interface for Hedgehog, which in turn exposes IBristles 
public interface IHedgehog { 
    bool IsSquashed { get; } 
    IBristles Bristles { get; } 
} 
// Here, Hedgehog does not properly implement IHedgehog, even though 
// Bristles implement IBristles. Will not compile. 
public class Hedgehog : IHedgehog { 
    public bool IsSquashed { get; set; } 
    public Bristles Bristles { get; set; } 
} 

가 (내가 원하는하지 않는)에 IHedgehog 인터페이스에 직접 강모를 노출하거나 다른과 다른 속성을 만들 :이 직관적으로 할 수있는 올바른 방법을 보이는 것입니다 이름 (정말 안 중 하나를 수행 할, 나는 IHedgehog이 IBristles이 재산 IsSquashed을 가지고 같은 방법으로, 속성 강모를하고 싶습니다.)

public interface IHedgehog { 
    bool IsSquashed { get; } 
    IBristles ReadOnlyBristles { get; } 
} 
public class Bar : IBar { 
    public bool IsSquashed { get; set; } 
    public Bristles Bristles { get; set; } 
    public IBristles ReadOnlyBristles { get { return this.Bristles; } 
} 

오히려 우아 보인다. 실제 고슴도치 개체를 처리 할 때

은 물론, 우리는 적절한 강모 개체 수는 getter 및 완전한 기능 세터와 반환 된 객체가 필요합니다. 그러나 IHedgehog는 Bristles 게터에서 IBristles를 반환해야합니다.

더 나은/일반적으로 사용되는 패턴이 있습니까?

답변

2

를 사용하여 명시 적 인터페이스 구현 :

public class Hedgehog : IHedgehog 
{ 
    public bool IsSquashed { get; set; } 

    // your public property 
    public Bristles Bristles { get; set; } 

    // implements the interface 
    IBristles IHedgehog.Bristles { get { return Bristles; } } 
} 
+0

고마워, 그게 내가 원하는거야. –

0
public class Hedgehog : IHedgehog 
{ 
    private Bristles _bristles; 

    public bool IsSquashed { get; set; } 

    public IBristles Bristles 
    { 
     get {return _bristles;} 
     set {_bristles = value;} 
    } 
} 

IHedgehog을 구현하려면, 강모하지 IBristles를 반환하는 게터 필요

+0

감사합니다,이 패턴의 문제는 그러나입니다 당신은 '진짜'와 상호 작용하는 wan't 경우 Hedgehog 그러면 Bristles 오브젝트 전체가 노출되지 않습니다. 그러나 Bristles가 IBristles를 구현하더라도 IHedgehog는 Bristles _ 또는 _ 기타 간접 속성 중 하나를 노출해야합니다. –

+0

그렇습니다. 그러나 인터페이스를 사용하는 요점은 구현을 직접적으로 드러내는 것이 아니라는 것입니다. Bristles 타입의 세터를 넣 자마자 IBristle의 모든 혜택을 곧바로 빈으로 가져갑니다. 위의 내용은 정직한 해킹입니다. –

관련 문제