2017-04-20 7 views
2

글쎄, 제목은 그것을 말하지만 내 상황에 더 구체적이고 내 문제를 설명 할 것입니다. 나는 다음과 같은 클래스가 있습니다다른 필드가 수정 될 때마다 필드 수정하기

class Attribute{ 
    private int score; 
    private int tempScore; 
    private int misc; 

    // here I have getters and setters 
    // A method 
    public int Modifier(){ 
     return (score+tempScore-10)/2; 
    } 
} 

class SavingThrow{ 
    private int base; 
    private int resistance; 
    private int bonus; 
    private int misc; 

    //Getters and setters here 
    //A method 
    public int Total(){ 
     return base + resistance + bonus + misc; 
    } 
} 

우리가 지금은 속성 지혜와 것 SavingThrow과 플레이어 A를한다고 가정 해 봅시다. 첫 번째가 수정 될 때마다 : 예 :

A.Wisdom.Score = 12; 

그 다음 두 번째는 수정되어야합니다. 이 예에서 나는해야한다 :

A.Will.Bonus = A.Wisdom.Modifier(); 

을 달성하는 방법에 대한 어떤 생각을?

나는 다음과 같은 해결책을 생각했지만, 내가 설명 할 이유 때문에 나를 만족시키지 못한다.
지혜에 대한 외부 액세스는 미리 정의 된 공용 메서드 인 SetWisdom (int score)을 통해서만 수행 할 수 있으며, 그 방법에서는 Will을 업데이트합니다. 비록이 문제는 tempScore 나 misc를 대신 수정해야한다면, 다른 방법을 사용해야한다는 것입니다. Attribute 클래스에 더 많은 필드를 추가하면 다소 불투명 한 것 같습니다 ().
그렇지 않으면, 전체 속성을 새로운 객체로 대체하는 SetWisdom (Attribute wisdom) 메소드를 사용할 수 있습니다.이 메소드에서는 수정되지 않은 모든 필드를 복사하고 필요한 것을 대체해야합니다. 조금 어색하고 우아하지 않다.. 어떤 솔루션을 선택 하시겠습니까? 더 중요하게는 이 처리 방법에 대한 더 좋은 아이디어가 있습니까??

+4

'base'는 C#의 키워드이므로 변수 이름으로 사용할 수 없습니다. – UnholySheep

+2

[INotifyPropertyChanged' (https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged (v = vs.110) .aspx)를 찾고 있다고 생각합니다. 필드가 속성으로 변경되어야하며, 사용자가 작업하는 동안 표준 .NET 사용과 일관되게 읽기 전용 속성으로 메서드 'Total' 및'Modifier '를 변경해야 할 수도 있습니다. –

+0

@UnholyShep : 예, 방금 알아 챘습니다. 저는 C#에 익숙하지 않아서 몰랐습니다. – Harnak

답변

3

가장 쉬운 방법은 값의 복사본을 만들지 않는 것입니다. 그런 다음 값을 복사하기 위해 복사 한 위치를 추적 할 필요가 없습니다.

class SavingThrow{ 
    private int base; 
    private int resistance; 
    private Attribute attribute; 
    private int misc; 

    //Getters and setters here 
    //A method 
    public int Total(){ 
     return base + resistance + attribute.Modifier + misc; 
    } 
} 

생성자의 속성을 설정하면 귀하의 클래스는, 다음과 같이 사용될 수있다 :

Attribute wisdom = new Attribute(16); 
SavingThrow will = new SavingThrow(wisdom); 

Console.WriteLine(will.Total()); 

wisdom.Add(2); 

Console.WriteLine(will.Total()); 

총 점수 (가정 지혜에 두 수식을 증가 추가) 증가한다 절약 인해를 던지기 수업은 사본을 결코 가지고 있지 않다.. 그러나 지혜를 직접 참조한다.

+0

매우 명확하고 좋은 솔루션입니다. 나는 이것을 시험해 볼 것이다! 많은 감사합니다! – Harnak

+0

동일한 문제가 있지만 정수가 있습니다. 플레이어는'size' 필드를 가지고 있고 ArmorClass는'size' 필드를 가지고 있습니다. 비록 그것이 객체가 아니라 원시 적이기 때문에 지금 복사해야합니다 (다른 클래스의 경우에도 Player에서 필요하기 때문에 ArmorClass에만 필드를 남겨 둘 수는 없습니다). 포인터를 사용해야합니까? 그것은 '안전하지 않은'영역이기 때문에 그것이 올바른 해결책인지는 확신 할 수 없습니다. 아니면 그냥 수업에 포장해서 사용해야하나요? – Harnak

+0

@Harnak 플레이어의 갑옷 크기가 변경됩니까? 또는 다른 방법 라운드? "착용자"라고 불리는 갑옷의 속성이나 갑옷이 연결되어야하는 경우 "갑옷"이라는 플레이어의 속성으로 플레이어를 간단하게 지정할 수 있습니다. – nvoigt