簡體   English   中英

如何將兩個類連接在一起

[英]How to connect two classes together

我正在制作一個圖庫工具,可以讓您瀏覽和編輯對象。 我有一個'庫' class 管理畫廊列表的獲取和顯示。 我還有一個“ActiveItem”資產,它加載所選 object 的所有信息並處理修改它。

現在,有一些信息存儲在我想在我的活動項中使用的“庫”class(例如文件路徑)中。

我對如何有效地進行設置有點困惑。

我考慮過將活動項 class 嵌入庫 class 中,但是必須通過庫 class 訪問活動項的所有功能和屬性有點煩人(所以我不得不寫 lib.活動項。加載())。 Activeitem 已經深入了 4 個級別,而且變得有點多。

還有其他設置方法嗎? 我可以在活動項 class 中存儲庫 class 實例的引用,以便活動項 class 可以獲取庫實例的屬性嗎?

編輯:添加了一些代碼片段

這是 class 定義:

class Library
{
    ...
    public string LibDirectory;
    ...
}


class ActiveAsset
{
    ...

    public SaveAsset()
    {
        //this method needs to know the LibDirectory property of the libraryclass
    }
 }

在啟動我的 winform 時,我啟動了兩個類:

Library lib = new Library();
ActiveAsset activeAsset = new ActiveAsset();

我建議創建一個包含 Library 和 ActiveItem 實例的包裝器 class 。 因此,您可以使用更通用的方法,例如:

  • GetAllItems() - 從庫中獲取所有項目
  • ActivateItem(Item item) - 激活提供的項目(將給定項目存儲到包裝類中的變量)

等等。將包裝器 class 視為您的應用程序的管理器。 你只想和那個經理一起工作,不管它下面是什么。

鑒於問題評論中的擔憂,如果您希望 ActiveAsset 能夠從 Library 中讀取信息,您可以更改 ActiveAsset 的構造函數以接收 Library 並將其作為私有 var 在內部存儲。

class ActiveAsset
{
   private Library _lib   

   public ActiveAsset(Library lib) {
     this._lib = lib
   }

    public SaveAsset()
    {
        // reach lib instance from here
        this._lib.LibDirectory
        //this method needs to know the LibDirectory property of the libraryclass
    }
 }

如果您擔心設計和耦合,您可以在庫中創建接口,然后讓構造函數使用它而不是庫 class

 interface ILibrary {
    string LibDir { get; set; }
 }
 
 class Library : ILibrary {

 }

 class ActiveAsset
{
   private ILibrary _lib   

   public ActiveAsset(Library lib) {
     this._lib = lib
   }

    public SaveAsset()
    {
        // reach lib instance from here
        this._lib.LibDirectory
        //this method needs to know the LibDirectory property of the libraryclass
    }
 }

至於性能和創建深層嵌套類,我認為您不必擔心太多,您可能會在類太多之前遇到數據保存/檢索性能問題。 只有當您嘗試讓您的代碼在 memory 受到限制的小型平台(如 rasberryPi 等)上運行時,這種性能設計才真正重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM