none
請問這行得通嗎? RRS feed

  • 問題

  • 目前一個方案中含兩個專案,A專案和B專案
    A專案參考B專案,A專案主要是放login和主選單,B專案放Form1,form2,form3.....
    A專案主選單呼叫B專案的form1後,在form1中輸入資料後,按form1的button會切到form2...
    可是form2必須嵌在A專案的主選單中,若是同專案,
    寫法可以是如此
        Form1 fr1 = new Form1();
                fr1.MdiParent = this;
                fr1.Show();
    可是在這邊,該如何呼叫form2呢?因為B專案沒參考A專案。
    2008年4月7日 上午 06:30

所有回覆

  • 怎麼B專案沒參考A專案?

    不然

       Form1 fr1 = new Form1();
                fr1.MdiParent = this;
                fr1.Show();

    不會錯嗎?

     

    fr1.MdiParent = this;

     

    fr1 是B 專案 this 是A專案

     

    由 fr1 去 驅動  fr2 ,然後將  fr1.MdiParent 傳到  fr2 不是都串起來了.

     

    當然你這樣做問題會很多, 專案去切不是想怎麼切就怎麼切,裡面包含高內聚,低偶合....眾多議題,如果用互相參照方式,以後Code 就改不完.

     

     

    2008年4月7日 上午 09:30
  • 好說大大:
      B專案無法參考A專案,會出現錯誤訊息【無法加入A專案,將此專案當作參考加入會造成循環相依的情況】...
    以上的code目前是無法work的,我會試試您說的方法,請教一下,高內聚、低偶合是什麼意思?謝謝!
    2008年4月7日 上午 09:58
  • 高內聚,低偶合你要去查書.

    像你的範例就是高偶合,而且高到連工具都抓出來.

    所謂低偶合,就是2個Class,2個專案間的關係很緊,如 A 參照 B 又參照 A,這就產生循環相依的情況,也就是你改 A專案,它會影響到B 專案,改 B專案又影響A專案.

     

    當然你這種 A->B->A 對有經驗的程設師比較少出現 但  A->B->C->A 就有可能出現.

     

    要去切專案有很多方法論,當然你要去看很多書,很多Code 才切得出來.

    以下是我切的經驗,當然我不會去死背,只是大概寫一下.

     

    1.專案水平切割1.  UI Presenter -> UI Logic->Biz Logic->Biz Object->Data Access-> Data Store 這是寫企業程式. 

    2.專案水平切割2. BizClass->抽像Class->BaseClass->Interface 這是寫Framework 比如你要寫 UI Class...

    3.垂直切割   HostApplication->人事系統

                      HostApplication->會計系統

                      HostApplication->物流系統

     

    你去注意一下 這邊參照方向都是單向的,不會有 A->B->的情形.

     

    所以以你的Case 是要用 3.方式

    也就是你的 A->B 你要寫一支  Application 在專案 A 然後去呼叫 專案 B 的 FormA ,執行完後再將環境回到 Application 然後去呼叫 Form B

    2008年4月7日 下午 02:48
  • 謝謝好說大大這麼詳細的講解,我想採用您所建議的3.
    不過我的問題,又回到原點...
    【你的 A->B 你要寫一支  Application 在專案 A 然後去呼叫 專案 B 的 FormA ,執行完後再將環境回到 Application 然後去呼叫 Form B】在專案A呼叫專案B的FormA是沒有問題的,可是FormA有可以會再呼叫相關的FormB...C...D,而這些Form都與A同屬一個專案,而這些FormB..C..D又必須架構在專案A的MDI之下....因為專案A有參考專案B呼叫得到FormA,但FormA觸發呼叫FormB時,該如何抓到專案A的parent?也就是說專案B是被參考的,是否就沒辦法抓到專案A的值?
    2008年4月9日 上午 02:37
  • 你是要傳專案A 的什麼值到專案B?

    你直接傳值過去就好了.

     

    範例,專案B 參考 專案 A 的員工物件

    你就作專案C 做降耦用.

     

    Namespace C {

       public class BizEmployee{

    }

    }

     

    在專案A 設參考專案 B,C

     

    using B;

    using C:

    Namespace A{

       public class App{

           private BizEmployee emp;

           public void Run(){

            FormA formA=new FormA(emp);

            formA.Show();

           }

       }

      

    }

     

    建專案B 加 C專案參考

    using C:

    Namespace B{

       public class FormA{

           private BizEmployee emp;

           public FormA(BizEmployee emp){

           this.emp=emp;

           }

       }

     

    這樣就能參考到專案A的物件了.

     

    而 C,B->C,A->B, A->C 這樣就不會有循回參照的問題.

      

    }

    2008年4月9日 上午 08:18