سؤال

قل أن لدي عقارًا في الفصل:

Vector3 position{get; set;}

لذلك أقوم بإنشاء مثيل لتلك الفئة في مكان ما ، والآن أريد تغيير الموضع. x ، سيكون ذلك مستحيلًا الآن لأن مجموعة Getter و Setter والحصول على الكائن بالكامل. لذلك لا بد لي من جعل ناقل مؤقت 3 تغيير قيمه ثم تعيينه.

عادةً ما أقوم بإنشاء موقع عام حتى يتم حل المشكلة. لكنني لا أستطيع القيام بذلك في هذه الحالة لأن الموقف هو تنفيذ واجهة ولا يمكن أن يكون لها واجهات حقول.

فكيف يمكنني حل هذا أفضل طريقة.

تحرير: Vector3 هو بنية لذا فهو نوع من القيمة

هل كانت مفيدة؟

المحلول

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 القيمة وإعادة تعيينها إلى العقار. يمكنك جعل إنشاء المثيل أسهل من خلال توفير مُنشئين مفيدين أو إضافة طرق لإرجاع كائن معدّل (بدلاً من تعديل القيمة).

قبل PS: رأيت بعد فوات الأوان 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 منشأه. تقوم بربط العقار بمثيل ثابت أثناء التهيئة وتوفر فقط getter:

Vector3 position
{
    get
    {
        return _position;
    }
}

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

من خلال جعل العقار قراءة فقط (أي لا يوجد أداة) ، يمكنك التأكد من أنه لن يتم استبداله بـ جديد Vector3 هدف. بدلاً من ذلك ، يمكنك ربطه بمثيل ثابت (_position) في وقت التهيئة. لكن يمكنك تغيير Vector3 عن طريق تعيين قيم جديدة ل position.X, position.Y, ، أو position.Z.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top