關閉。這個問題需要細節或清晰。它目前不接受答案。
想改進這個問題?通過編輯此帖子添加詳細資訊并澄清問題。
2天前關閉。
改進這個問題我的模型中一定有一個未知型別的屬性,因為我需要根據我從資料庫中檢索到的字串資料,在我生成模型之后,定義這個屬性應該是哪個類。我這樣做了,但我無法訪問其中的方法,因為我稍后定義了物件并且它沒有靜態型別。我應該怎么做這個問題,最有效的解決方案是什么?
我的模特
public class Device
{
public int DeviceId { get; set; }
public string deviceJson { get; set; }
public string DeviceTags { get; set; }
public string DeviceIndividualTags { get; set; }
public List<Node> Nodes { get; set; } = null;
public object Driver { get; set; } = null;
}
我的經理物件
public class ModbusTcpIpClient
{
public ModbusTcpIpClient(Device device)
{
}
public void Start()
{
//do somethings
}
}
我的嘗試
foreach (var item in devices)
{
devices = mysqlManager.GetDevices();
JObject channelJson = JObject.Parse(item.channelJson);
switch(channelJson["servermain.MULTIPLE_TYPES_DEVICE_DRIVER"].ToString())
{
case "Modbus TCP/IP Ethernet":
item.Driver = new ModbusTcpIpClient(item);
break;
}
}
foreach (var item in devices)
{
Thread th = new Thread(item.Driver.Start); // in this block i cant go to Start method in the driver
}
uj5u.com熱心網友回復:
這就是我朋友的抽象。例如,您應該創建一個介面IDriver,然后您可以創建多個將從該介面繼承的類。在介面中,您可以宣告繼承類必須實作的方法。然后,您可以簡單地將 Driver 欄位型別從 更改object為IDriver。老實說,您的問題在一般編程中很常見,您可以查找設計模式 - 它會幫助您相信我。我是一名自動化工程師,我知道您要實作的目標。當您的設備必須與 Profibus 而不是 Modbus 兼容時,您會怎么做?CANopen 和 EtherCAT 怎么樣?
請記住使您的介面盡可能小。不要在必須實作僅適用于一種物件的方法的地方構建介面。例如,您不想創建IPrinter,因為還有列印機與掃描儀集成,如果IPrinter必須實作列印和掃描方法,那很糟糕,因為這會強制所有列印機實作掃描方法。相反,您應該創建IPrinter和IScanner作為單獨的介面,即使它們只有一種方法。然后,您可以從IPrinter表示不帶掃描儀的列印機的類中繼承,在帶有掃描儀的類中,您可以從兩個介面簡單地繼承!就這么簡單!
設計模式和 SOLID 是您的好朋友,它們將節省您的大量時間。
保持!我經歷了那個,由于我缺乏知識,我以完全相同的方式搞砸了我的 SCADA。
有什么事情盡管問我 :)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/481946.html
上一篇:呼叫OOP函式時,TypeError:接受1個位置引數,但給出了2個。我該如何解決?
下一篇:讓子類與父類通信的最佳方式是什么
