2010-01-17 8 views
3

내가 클래스의 속성을 말해봐 getter 및 setter를 설정하고 전체 개체를 가져옵니다. 그래서 나는 임시 Vector3의 값을 변경 한 다음 할당해야합니다.C# 게터는/세터 문제

일반적으로 문제가 해결 될 수 있도록 위치를 공개 필드로 지정합니다. 하지만 포지션은 인터페이스의 구현이고 인터페이스는 필드를 가질 수 없기 때문에이 경우에는 할 수 없습니다.

그래서 어떻게하면 가장 좋은 방법으로 해결할 수 있습니다.

편집 : Vector3이 구조체는 너무 값 형식 가변 값 유형 문제 중 하나

답변

5

, 여기에 가장 쉬운 대답 : 당신은 단지 하나 개의 차원을 변경하거나 모든 변경 obj.Position을 변경해야하는 경우

private Vector3 position; 
public Vector3 Position { 
    get {return position;} 
    set {position = value;} // with @Mehrdad's optimisation 
} 
public float X { 
    get {return position.X;} 
    set {position.X = value;} 
} 
public float Y { 
    get {return position.Y;} 
    set {position.Y = value;} 
} 
public float Z { 
    get {return position.Z;} 
    set {position.Z = value;} 
} 

지금 당신이 obj.X, obj.Yobj.Z을 변경할 수 있습니다. 당신이 인터페이스를 구현 이름 position 필요한 경우

, 다음 명시 적으로 수행

Vector3 IWhateverInterface.position { 
    get {return position;} 
    set {position = value;} 
} 
+0

네, 그게 내가 생각하지만, 내가 위의 의견에 설명 된 것처럼 수정 된 할당됩니다 그래서 가장 효율적인 방법은 무엇입니까? 해답을 읽는 것이 이것이 내가하는 유일한 길이라고 생각 하나? – slayerIQ

+1

이것은 기본적으로 메소드를 제공하는 것과 동일합니다. 가능한 미세 최적화는'Position'에 대해 자동 속성을 사용하지 않고'X' 속성에서'position.X'를 직접 수정하는 것입니다. –

+0

@slayerIQ 전투를 선택해야합니다. 그게 문제라면 필드로'position'을 드러내고 마지막에 추가 한 비트에 따라 명시 적 인터페이스 구현을 할 수 있습니까? –

2

입니다. 새 X 값을 사용하여 값 유형의 새 인스턴스를 만들고 속성에 다시 할당 할 수 있습니다. 유용한 생성자를 제공하거나 값을 수정하는 대신 수정 된 객체를 반환하는 메소드를 추가하여 인스턴스 작성을보다 쉽게 ​​만들 수 있습니다. IMO

+0

위치가 변경 될 수 있습니다. 따라서 새 인스턴스를 만들거나 속성을 수정할 때마다 메서드를 호출하면 과도한 작업이됩니다. – slayerIQ

+0

@slayerIQ : 인터페이스에서 수정할 수 없습니다. 여러분은'Vector3' 클래스를 만들거나 (아마도 이상적이지 않습니다) 인터페이스에서 위치를 수정하는 메소드 (예 :'MoveHorizontally (float distance)'와 같은 것들)를 제공하거나 클라이언트가 'obj.Position = new Vector3 (obj.Position.X + 10, obj.Position.Y, obj.Position.Z);'. 이 문제는 실제로 더 나은 해결책이 없습니다 (표준 예제는'Control' 클래스의'Location'과'Size' 속성을 가진 Windows Forms입니다). –

+0

slayerIQ는 Vector3가 값 유형이라고 결코 말하지 않았습니다. 사실이 게시물은 그것이 수업이라고 말합니다. 그것이 오타이든 아니든간에 명확하지 않습니다. – Eilon

0

사전 P.S을. : 너무 늦어서 Vector3은 값 유형입니다. 그러므로 다음 게시물은별로 도움이되지 않을 것입니다. 실수해서 미안해. 이제 다시

class Vector3 : IVector3 
{ 
    double IVector3.X 
    { 
     get { ... } 
     set { ... } 
    } 
    ... 
} 

:

Vector3에서
interface IVector3 
{ 
    double X { get; set; } 
    double Y { get; set; } 
    double Z { get; set; } 
} 

, 당신은 단순히 다른 모든 것들과 같은 사람들을 구현 : 인터페이스 필드를 가질 수 없습니다 동안

글쎄, 그들은는 예를 들어, 속성을 가질 수 position 속성에 당신은 초기화하는 동안 고정 된 인스턴스에 속성을 넥타이 만 게터 제공 : 읽을 전용 (. 즉, 아무 세터) 속성을함으로써

Vector3 position 
{ 
    get 
    { 
     return _position; 
    } 
} 

private Vector3 _position = new Vector3(...); 

을, 당신은이 새로운 Vector3로 대체되지 않도록 목적. 대신 초기화 시간에 고정 인스턴스 (_position)에 연결합니다. 그러나 position.X, position.Y 또는 position.Z에 새 값을 할당하여 Vector3을 변경할 수 있습니다.

+0

대체 접근법은 IVector3을 구현하고 Vector가있는 주 객체에 대한 참조를 보유하는 VectorAccessor 클래스 또는 구조체를 정의하는 것입니다. 그것의 X, Y, Z 속성은 MainObject._position.X에 접근 할 것입니다. 메인 클래스가 작은 구조의 큰 배열을 가지고 있다면 이것은 좋은 접근 방법이 될 것입니다. 인덱서는 XYZ가 MainObject._positions [Index] .X 등을 참조하는 VectorIndexer 속성을 반환합니다. – supercat

9

직접적인 해결책이 허용되지 않습니다.

foo.position = new Vector(newX, foo.position.Y, foo.position.Z); 

무엇이 잘못 되었나요? 그것은 매우 직설적 인 것처럼 보입니다.