none
請問可以在類別實例化後, 依屬性值再去轉換成別的類別嗎? RRS feed

  • 問題

  • 請問C#是否能在實例化類別後, 依類別的屬性值去轉型成他的子類別呢?

    以下圖來說我實作一個機種A叫MA, MA中有個Motor屬性, 我設為油壓後. 則MA轉為油壓類別(該類別繼承機種A).

    如果我設MA的Motor屬性為伺服, 則MA轉為伺服類別(該類別繼承機種A).

    我實際轉換, 會出現無法將機種A類型的物件轉為機種A油壓類型的物件.

    請問是否有方法可以達成呢?

        class Program
        {
            static void Main(string[] args)
            {
                CMachineA cMachineA = new CMachineA();
                cMachineA.Motor = EMotor.Hydraulic;
    
                if (cMachineA.Motor == EMotor.Hydraulic)
                {
                    cMachineA = (HydraulicMachineA)cMachineA;
                    //HydraulicMachineA ha = cMachineA as HydraulicMachineA;
                }
    
            }
        }
    
        // 機台種類列舉
        public enum EMachineType
        {
            [Description("機台A")]
            MachineA,
            [Description("機台B")]
            MachineB,
        }
    
        // 機台馬達種類列舉
        public enum EMotor
        {
            [Description("油壓")]
            Hydraulic,
            [Description("伺服")]
            Servo,
        }
    
        // 機台基礎
        public abstract class AMachineBase
        {
            // 機台種類
            public abstract EMachineType MachineType { get; }
    
            // 機台高度
            public abstract int MachineHeight { get; set; }
        }
    
        // 機台A : 機台基礎
        public class CMachineA : AMachineBase
        {
            // 馬達種類
            public EMotor Motor { get; set; }
    
            // 機台種類為A
            public override EMachineType MachineType
            {
                get { return EMachineType.MachineA; }
            }
    
            public override int MachineHeight { get; set; }
        }
    
        // 機台B : 機台基礎
        public class CMachineB : AMachineBase
        {
            // 馬達種類
            public EMotor Motor { get; set; }
    
            // 機台種類為B
            public override EMachineType MachineType
            {
                get { return EMachineType.MachineB; }
            }
    
            public override int MachineHeight { get; set; }
        }
    
        // 油壓機台A
        public class HydraulicMachineA : CMachineA
        {
            // 參數1
            public float para1 { get; set; }
    
            // 參數2
            public float para2 { get; set; }
    
            // 參數3
            public float para3 { get; set; }
        }
    
        /// 伺服機台A
        public class ServoMachineA : CMachineA
        {
            // 參數1
            public float para1 { get; set; }
    
            // 參數2
            public float para2 { get; set; }
    
        }

    2021年9月17日 上午 02:32

所有回覆

  • 如果您的程式是從資料庫讀出記錄, 然後依據記錄讀出的記錄的欄位內容值建立不同類別的物件, 可以考慮使用類似Entity Framework之類的ORM解決方案
    2021年9月17日 下午 12:20
  • 執行個體本身的型別是不能轉換的。你只能產生一個新的子類別執行個體,然後用原來的父型別變數指向他。

    不過呢,如果能了解全盤的需求,也許應該是換一種想法來做。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2021年9月18日 下午 07:36
    版主
  • 我後來查了查設計模式的方式, 我可能會試著用builder pattern的方式來建構.

    依照不同的需求去加入屬性後再建出來.

    2021年9月23日 上午 02:29