กำหนดตัวแปรด้วยตัวแปรย่อย (หรือมีคุณสมบัติ)

เป้าหมายคือการมีตัวแปรที่มีคุณสมบัติ Unit ซึ่งสามารถเข้าถึงได้โดยเช่น:

Params MyParams;    

MyParams.Diae = 100.0;
MyParams.Diae.Unit = "kg";

ตามหลักการแล้ว ตัวแปร Diae เป็นสมาชิกของ Class Params และควรสืบทอดคุณสมบัติ Unit จากคลาส IParameter:

internal class IParameter
{
    string unit;
    internal string Unit { get; set; }

    internal IParameter()
    {
        unit = "";
    }

}

จะประกาศตัวแปร Diae ได้อย่างไร? นี่คือตัวอย่างรหัสเสมือนของการประกาศที่คาดหวัง:

namespace SomeCode
{
    internal class Params
    {
        double diae;

        internal class Diae:IParameter
        {
            get { return diae; }
            set { diae = value; }
        }
    }
}

person Jan    schedule 06.05.2013    source แหล่งที่มา
comment
ฉันไม่เข้าใจ คุณต้องการอะไรกันแน่? คลาสที่มี double Value และ string Unit? เป้าหมายสุดท้ายของคุณคืออะไร?   -  person ppetrov    schedule 06.05.2013
comment
นั่นจะเพิ่มความซับซ้อน (คุณจะต้องมีสองชั้น) โดยไม่มีผลประโยชน์ใด ๆ ที่มองเห็นได้   -  person Steve Wellens    schedule 06.05.2013
comment
ตัวแปรที่ประกาศเป็นวัตถุ String มีความเป็นไปได้ที่จะมีค่า และสามารถเข้าถึงความยาวของตัวแปรได้โดยการต่อท้าย .Length ตัวแปร ฉันตั้งเป้าหมายเพื่อสิ่งที่คล้ายกัน การเข้าถึงค่าของตัวแปรเกิดขึ้นบ่อยกว่าหน่วยของมัน ดังนั้นการดำเนินการที่ต้องการ   -  person Jan    schedule 06.05.2013


คำตอบ (2)


คุณไม่สามารถทำสิ่งที่คุณต้องการได้อย่างแน่นอน คุณไม่สามารถเพิ่มคุณสมบัติพิเศษให้กับประเภทที่มีอยู่เช่น double ได้ ดังนั้นคุณจะต้องทำให้ Diae ส่งคืนคลาสแยกต่างหาก บางสิ่งเช่นนี้:

internal class ParamWithUnit
{
  public string Unit { get; set; }
  public double Value { get; set; }
}

internal class Params
{
  private ParamWithUnit diae = new ParamWithUnit();

  public ParamWithUnit Diae 
  {
    get { return this.diae; }
  }
}

จากนั้นคุณก็สามารถทำได้:

Params MyParams = new Params();    

MyParams.Diae.Value = 100.0;
MyParams.Diae.Unit = "kg";
person Jeremy Todd    schedule 06.05.2013

คุณจะ [ต้องการ] ไม่สามารถกำหนดสองเท่าให้กับ Diae ในขณะที่ยังคงปล่อยให้มีคุณสมบัติ Unit (คุณสามารถแฮ็กสิ่งนี้ผ่านการแปลงโดยนัยหรืออะไรทำนองนั้น แต่ฉันขอแนะนำไม่ให้คุณทำเช่นนั้น)

ตัวเลือกที่ดีที่สุดคือการสร้างคลาสเช่น Measurement ที่จะมีทั้งคุณสมบัติ Value และ Unit:

public class Measurement
{
    public double Value {get;set;}
    public string Unit {get;set;}
}

จากนั้น Diae อาจเป็นประเภทนั้นได้:

internal class Params
{
    public Measurement Diae {get;private set}
    public Params()
    {
        Diae = new Measurement();
    }
}

ตอนนี้คุณสามารถทำ:

Params MyParams = new Params();    

MyParams.Diae.Value = 100.0;
MyParams.Diae.Unit = "kg";
person Servy    schedule 06.05.2013
comment
แล้วการสร้างส่วนขยายให้กับวัตถุ Double ที่อยู่ภายในล่ะ แบบนี้จะสะอาดมั้ย? - person Jan; 06.05.2013
comment
@ Jansk83 อย่างที่ฉันพูดไปในคำตอบของฉันมันเป็นไปได้ แต่ไม่พึงปรารถนา - person Servy; 06.05.2013