質問
と言う私は、クラス内のプロパティを持っています:
Vector3 position{get; set;}
私は、そのクラスのどこかのインスタンスを作成して、今私は、変更position.xにしたいので、ゲッターとセッターセットとは、オブジェクト全体を取得しているため、それが今では不可能であろう。だから私は、一時のVector3は、その値を変更し、それを割り当てるようにする必要があります。
問題が解決されるだろうように、通常、iは位置公共分野になるだろう。しかし、位置がインタフェースを実装したものですので、私はこのケースではそれを行うカントとのインタフェースは、フィールドを持っているカントます。
それでは、どのように私はこれに最善の方法を解決することができます。
は編集:のVector3が構造体であるので、そのA値型
解決
IMO、ここでは最も簡単な答えます:
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.Y
、obj.Z
とobj.Position
を変更することができます。
あなたがインターフェイスを実装するために名前position
が必要な場合は、明示的にそれを実行します。
Vector3 IWhateverInterface.position {
get {return position;}
set {position = value;}
}
他のヒント
許容何とか簡単な解決策はありませんか?
foo.position = new Vector(newX, foo.position.Y, foo.position.Z);
何で間違っていますか?それは完全に簡単そうです。
変更可能な値型の問題の一つです。新しいX
値を持つ値型の新しいインスタンスを作成して、プロパティに割り当て直すことができます。あなたは便利なコンストラクタを提供するか、(代わりに値を変更する)変更されたオブジェクトを返すメソッドを追加することによって、より簡単に、インスタンスの作成を行うことができます。
をプリP.S の:。のソー手遅れVector3
が値型であること。以下の記事は、したがって、多くの助けになることはありません。申し訳ありませんがその間違いについて。の
さて、インタフェースがフィールドを持つことができない一方で、彼ら のできる性質を持って、例えば:ます。
interface IVector3
{
double X { get; set; }
double Y { get; set; }
double Z { get; set; }
}
あなたのVector3
では、あなたは、単に他のもののようにすべてを実装します
class Vector3 : IVector3
{
double IVector3.X
{
get { ... }
set { ... }
}
...
}
今すぐ戻ってあなたposition
プロパティに。あなたは、初期化時に固定のインスタンスにプロパティを結ぶ唯一のゲッターを提供します:
Vector3 position
{
get
{
return _position;
}
}
private Vector3 _position = new Vector3(...);
プロパティにすることにより、は読み取り専用(すなわち。ノーセッター)、あなたはそれが新しいVector3
オブジェクトに置き換えられないことを確認してください。代わりに、初期化時に固定インスタンス(_position
)にそれを結びます。しかし、あなたはVector3
、position.X
、またはposition.Y
に新しい値を割り当てることによってposition.Z
を変更することができます。