2009-11-19 5 views
0

수정할 수없는 속성을 가진 변경할 수없는 클래스와이 클래스에서 파생되는 변경 가능한 클래스를 만드는 데 관심이 있습니다. 이러한 객체는 데이터베이스 레코드를 나타내는 간단한 데이터 객체이므로 속성의 불변 값만 갖게됩니다.C#에서 변경할 수없는 객체에서 파생 된 변경 가능한 객체를 만드는 방법은 무엇입니까?

내 목표는 데이터베이스 값을 기반으로 속성을 설정하지만 이러한 개체의 읽기 전용 버전을 다시 응용 프로그램에 전달하여 데이터 액세스 레이어에서 개체의 변경 가능한 버전을 정상적으로 만들도록하는 것입니다. (개발자가 실제로 원할 경우 코드가 명시 적으로 변경할 수없는 객체를 다시 가변적 인 것으로 캐스팅 할 수 있다는 사실을 확인합니다.)

다음과 같은 방법으로이 uglily를 수행 할 수 있습니다. getter 및 setter와 가변 클래스에 대한 공공 새로운 세터를 갖는 :

public class ImmutableClient { 
    private int _clientId; 
    public int getClientId() { return _clientId; } 
    protected void setClientId(int clientId) { _clientId = clientId; } 
} 

public class Client : ImmutableClient { 
    public new void setClientId(int clientId) { base.setClientId(clientId); } 
} 

나는 가능하면 자동 속성을 사용하는 것을 선호 것 - 그들은 디버깅 할 때 훨씬 좋네요입니다. 그 외에도, 코드 생성기에서 온 것이며 결코 보지 않을 것이므로 코드가 어떻게 보이는지는별로 신경 쓰지 않습니다.

아이디어가 있으십니까?

답변

3

인터페이스를 사용합니다. 클라이언트에게 반환되는 읽기 전용 인터페이스와이를 구현하는 완전히 쓰기 가능한 클래스가 있지만 데이터 액세스 계층에서만 사용됩니다. - 발신자에만 사용

interface IClient 
{ 
    int getClientId(); 
} 

그런 다음 당신은 당신의 구체적인 구현이 세터가 아닌지 걱정 할 필요가 없습니다 :

interface IReadOnlyObject 
{ 
    int Property { get; } 
} 

class DALObject : IReadOnlyObject 
{ 
    public int Property { get; set; } 
} 
+0

완벽합니다. 나는 인터페이스에 대해 생각조차하지 않은 수업에서 너무 죽었습니다.하지만 그건 내 시나리오에서 절대적으로 효과가있었습니다. 고맙습니다. –

2

당신은 당신의 데이터 층은 읽기 전용 인터페이스를 반환 할 수 있습니다 게터. 보조 노트로

은 - 당신의 코드가 더 C#을보다 자바처럼 보이는, 그래서 실제로 사용합니다 :

interface IClient 
{ 
    int ClientId { get; } 
} 
+0

완벽 - 당신과 닮은 매트가 거의 똑같은 시간을 보냈습니다 ... 자바와 비슷한 문법이 마음에 들지 않지만 제 예제에서는 getter 만 구현하고 싶다면 별도로 유지해야했습니다. 불변의 버전 - 자바와 같은 방식은 내가 당시 생각할 수있는 유일한 방법이었다. 인터페이스가 완벽 할 것입니다. - 감사합니다. –

0

불변의 불변을 의미합니다. 유형이 변경되지 않는다는 것을 알게되면, 변경하지 않고도 캐시하고 여러 번 조작 할 수 있다는 것을 알고 있습니다. 가변 상태는 그 가정을 쓸모 없게 만든다.

class Foo 
{ 
    // I'm immutable 
} 

class Bar : Foo 
{ 
    // I add mutable properties 
} 

... 

void F(Foo foo) 
{ 
    // foo is immutable - therefore Bar (mutable) *cannot* be derived from Foo. 
} 
+0

감사합니다. "불변"이 내 목표를 설명하는 데 적합한 단어가 아닐 것입니다. 개발자가 외부 코드에서 쉽게 수정할 수없는 객체를 원했습니다. 진정으로 불변하지 않고, 사실상 변하지 않습니다. 물론 내가 말할 수있는 것부터 진정한 불변 필드와 같은 것은 없습니다. 게임에 대한 성찰을 얻으면 개인 읽기 전용 필드를 수정할 수 있습니다. –

0

변형자를 제공하지 않지만 변경할 수없는 기본 클래스가 있습니다. 파생 불변 클래스와 별도로 파생 된 변경 가능한 클래스가 있습니다. 모든 클래스에는 기본 클래스를 허용하는 생성자와 생성자를 호출하거나 (객체가 이미 불변 클래스 인 경우) 불변 파생 클래스의 객체를 반환하는 오버로드 가능/과부하 된 "AsImmutable"속성이 있어야합니다. 그 자체.