2011-11-23 4 views
0

C++에서는 const 인 개체를 함수에 전달할 수 있습니다. 이렇게하면 코드가 해당 객체를 '읽기 전용'으로 처리합니다 (캐스트를 사용하여 constness를 제거 할 수 있다는 사실은 무시합니다). 나는 C#과 같은 것을하려고 노력하고있다. 사용자가 구현할 인터페이스가 있습니다. 메서드 중 하나에 매개 변수로 개체가 제공됩니다. 메서드의 범위에서 'const'개체를 만들고 다르게 변경할 수있는 방법은 무엇입니까?C#의 Const 개체 (매개 변수로)

솔루션 : 인터페이스. 인터페이스에서 유일한 속성을 사용할 수있는 'get'인터페이스를 만듭니다.

public interface IVal { ... } 


public interface IFoo 
{ 
    IVal Val { get; } 
} 

public class Foo : IFoo 
{ 
    public IVal Val { get; } 
} 

나는 인터페이스를 통과하고 모든 것이 훌륭합니다. 그러나, 내 구체적인 수업에서, 나는 '세트'를 사용할 수있게하고 싶습니다. 그것은 내가 구체적인 클래스 값을 설정할 수있게 해준다. 내 구체적인 수업은 어떻게 생겼지?

'internal'키워드를 사용하려고 생각했습니다. 나는 당신 자신의 어셈블리 내에서 코드에 메소드/속성을 노출 시킨다는 것을 읽었다. 이게 내 대답인가?

편집 : 더 잘 설명하기 위해 자동으로 캐스팅 해주는 설정기를 추가했습니다.

private Val _val; 
public IVal Val 
{ 
    get { return this._val; } 
    set { this._val = value as Val; } 
} 
+0

을 할 수 있습니다. 'Val'이 아닌 무언가에 그것을 놓으려고하면'null'로 자동 설정됩니다. 그것은 대부분의 사람들이 기대하는 것이 아닙니다. 당신은 아마도 당신이'Val' 또는'IVal'을 원하고 그것을 고수 할 것인지를 결정해야합니다. – svick

답변

3

당신은 단지 set을 추가 할 수 있으며 그것을 잘 작동합니다 : : 그러나 각 속성에 대해이 repetative 많은 코드는이처럼

public IValue Value { get; set; } 

, 당신은 값을 설정 할 수 있습니다 경우 Foo이 있지만, IFoo 인 경우에는 그렇지 않습니다. C++의 경우와 마찬가지로 IFoo이있는 경우 Foo (객체가 실제로 Foo 인 경우)으로 캐스팅 한 다음 setter를 사용할 수 있습니다.

public IValue Value { get; private set; } 

이 당신은이 클래스의 코드 (또는 protected의 경우 분류 상속)이 속성을 설정할 수 있는지 확인 할 수 있습니다 :

또 다른 옵션은 protected 또는 private이 세터를 확인하는 것입니다.

internal : 예, 동일한 어셈블리 (및 친구 어셈블리)의 코드에만 멤버를 노출합니다. 그러나 이것은 자주 사용되지 않습니다. 사용되는 (유용한) 것은 내부 유형입니다. 클래스가 public임을 지정하지 않으면 기본값입니다.

문제를 해결하는 데 도움이 될 수 있습니다. Foointernal을 만들면 IFoo이있는 다른 어셈블리의 메서드는 캐스팅을 사용하더라도 속성을 설정할 수 없습니다.

물론 코드는 리플렉션을 사용하여 속성을 설정할 수 있습니다. 하지만 대부분의 시간에 대해서는 걱정할 필요가 없습니다.

+0

이 값을 설정하려면 인터페이스로 전송해야합니다. this.Value = 새 값(); 오류가 발생하여 할당 할 때마다 캐스팅을 강요합니다. 이게 내 가장 큰 불만인데,이 일을하는 더 좋은 방법이 있니? – MarkP

+0

'this.Value = something'은 캐스팅하지 않아도 잘 동작합니다. – svick

+0

'Val에서 IVal로 암시 적으로 변환 할 수 없습니다 ...' – MarkP

1

당신은 그런 세터 아마 나쁜 생각 갖는 비슷한 일을

public class ReadonlyTestClass { 
private readonly object _name; 
public ReadonlyTestClass(object name) { 
    _name = name; 
} 
public object Name {get { return _name; }} 
} 

또는

public class ReadonlyTestClass { 
public ReadonlyTestClass(object name) { 
    this.Name = name; 
} 
public object Name {get; private set;} 
} 
+0

'세트'를 다른 클래스의 수업 외부에서 사용 가능하게하고 싶습니다. 다른 사람의 수업에 숨겨져 있기를 바랍니다. – MarkP

관련 문제