2012-01-12 6 views
1

배경 : 내부에 여러 레벨의 중첩 된 모양이있는 모양의 그림을 그립니다. 예를 들어 속성의 변경. 영역 내의 모든 모양과 모양은 모든 관련 속성과 모양을 변경하게됩니다.내부 설정 자와의 C# 인터페이스

내가 이렇게되면 디자인 패턴이 있습니다

을 내가 가지고, 서로 관련되는 속성의 톤을 가지고, 예를 들어 "NestedShapes"(토론을 위해)라는 개체 그래프, "지역" 및 "길이". 그러나 그래프는 벙어리가되도록 설계되었으므로 다른 값을 계산하는 방법을 알지 못하므로 그렇게하지 않을 것입니다.

그 대신 그래프는 그래프의 최상위 루트 노드 인 IRootShape를 그 생성자로 취하는 GraphManager에 첨부 될 수 있습니다.

NestedShapes는 INotifyPropertyChanged도 구현하는 IRootShape를 구현합니다. GraphManager는 이러한 속성 변경을 구독하고 관련 필드를 계산하고 IRootShape를 통해 그래프를 올바른 상태로 설정하는 논리를 실행합니다.

문제 : IRootShape와 함께 IShape, ISquare, ICircle 등이 실제 C# 인터페이스입니다. 하지만 문제는 이러한 속성 중 일부는 GraphManager에 전용 인 setter를 사용하기를 원합니다. 구현 셰이프는 여전히 공용 설정자를 노출 할 수 있습니다. 그러나 이 필요합니다.은 GraphManager에서 속성을 설정할 수 있도록 UI 측에서이 메서드를 노출하고 싶지 않습니다. 어떻게해야합니까? 내부 클래스가있는 기본 클래스가 갈 길을 설정 했습니까?

+1

정의에 의한 인터페이스는 외부에서 표시되어야하는 것을 선언합니다.나는 기본 클래스가 최선의 방법이 될 것이라고 말하려고 노력할 것입니다. –

+0

모든 셰이프에 공통된 동작을 원한다면 공통 기본 클래스에서 상속해야합니다. 또한, 왜 당신은'ICircle','ISquare' 등을위한 별도의 인터페이스가 필요합니까? 왜 'IShape'만이 아닌가? – ja72

+0

@ ja72 나는 내가 IShape, ISquare, ICircle에만 상태라고 말할 것이라고 생각한다. 동작은 GraphManager에 있습니다. – Jake

답변

2

GraphManager가 Base 클래스와 상호 작용하도록하십시오.

다른 모든 것은 인터페이스와 만 상호 작용합니다.

인터페이스에 속성을 표시하지 마십시오.

public class Circle : ICircle{ 
    public double Radius{ 
     get;set; 
    } 

    /* blah blah ... */ 
} 

public interface ICircle { 
    /* No properties */ 

    /* blah blah ...*/ 
} 
+0

+1. 또한 필요한 경우 getter를 인터페이스로 이동할 수 있지만 필요에 따라 내부/개인 설정기를 자유롭게 구현할 수 있습니다. –

+0

@Daryl 기본 클래스 아이디어를 얻습니다. 하지만이 경우 빈 인터페이스의 목적을 이해하지 못합니다. 설명해 줄 수 있니? – Jake

+0

@ Jake, 귀하의 코드입니다 - 속성을 가진 인터페이스를 갖고 싶습니다. 인터페이스를 추가 할 필요가 없습니다. 인터페이스를 전혀 필요로하지 않습니다. 인터페이스를 만들지 마십시오. –

0

인터페이스를 통해이를 수행하는 트릭은 두 개의 별도 인터페이스를 사용하는 것입니다. 하나는 공개이고 다른 하나는 내부 전용입니다. 예, 내부 인터페이스를 명시 적으로 구현하고 속성 계약을 실제 속성에 수동으로 위임해야하므로 좀 더 많은 코드가 필요하지만 'ClassName.Internal.cs'라는 파일의 부분 클래스에서이를 숨 깁니다

이렇게하면 기본 클래스를 사용하지 않고도 원하는 권한으로 인터페이스를 명확하고 깔끔하게 표시 할 수 있으므로이 기술을 사용하여 기존 개체 그래프를 확장 할 수 있습니다.

다음은 인터페이스를 통해 액세스 할 수있는 공용 getter 및 내부 setter가있는 TestItem의 예입니다.

여기 다음 부분을 통해 구현 클래스 TestItem.Internal.cs에 저장된 내부 전용 구현이다

public interface ITestItem 
{ 
    ModelItem Owner { get; } 
    ModelScope Scope { get; } 
} 

public partial class TestItem : ITestItem 
{ 
    // These implicitly handle ITestItem since the getters are public 
    public ModelItem Owner { get; internal set; } 
    public ModelScope Scope { get; internal set; } 
} 

TestItem.cs

에 저장된 공용 인터페이스 기본 클래스 파일이다.

internal interface IWritableTestItem 
{ 
    ModelItem Owner { get; set; } 
    ModelScope Scope { get; set; } 
} 

public partial class TestItem : IWritableTestItem 
{ 
    ModelItem IWritableTestItem.Owner 
    { 
     get => Owner; 
     set => Owner = value; 
    } 

    ModelScope IWritableTestItem.Scope 
    { 
     get => Scope; 
     set => Scope = value; 
    } 
} 

희망이 있습니다.

관련 문제