2013-04-20 145 views
0

我有一個問題,我不知道如何攻擊。希望有人能把我踢向正確的方向。 =)C#從通用對象/類中調用不同的類方法?

我創建了幾個類,即Word,Excel,Microstation。 在這些類中,我使用相同的名稱來執行相同的功能(但是使用不同的代碼)。

該程序(Excel加載項)的輸入是一個文件,可以是Word,Excel或Microstation。 根據文件類型,我創建了正確的類(Word,Excel或Microstation)的實例。

當我創建實例時,我想調用一個將調用實例化類函數的函數。

我想這樣做:代替

public function RunTheFunctions(??? o) 
{ 
    o.OpenFile(); 
    o.DoStuff(); 
    o.SaveFile(); 
} 

oWord.OpenFile(); 
oWord.DoStuff(); 
oWord.SaveFile(); 
oExcel.OpenFile(); 
oExcel.DoStuff(); 
oExcel.SaveFile(); 
oMicrostation.OpenFile(); 
oMicrostation.DoStuff(); 
oMicrostation.SaveFile(); 

我曾嘗試:

object o; 
Word oWord = new Word(); 
o = oWord; 
o.OpenFile(); 

但它不工作。

我希望我的問題比較清楚。 =)

問候, 小號

+2

定義一個接口的常用方法,並有你類實現接口。 – 2013-04-20 13:35:59

回答

1

您可以創建界面,這將通過您的Word,Excel中實現時,MicroStation類:

// interface for your document classes 
interface IDocument 
{ 
    void OpenFile(); 
    void DoStuff(); 
    void SaveFile(); 
} 

// Word implements IDocument 
class Word : IDocument 
{ 
    public void OpenFile() { /* ... */ } 
    public void DoStuff() { /* ... */ } 
    public void SaveFile() { /* ... */ } 
} 

// later 
public function RunTheFunctions(IDocument o) 
{ 
    o.OpenFile(); 
    o.DoStuff(); 
    o.SaveFile(); 
} 

// usage 
IDocument doc = new Word(); 
RunTheFunctions(doc); 
4

創建所需的方法的接口,並在具體的類實現它:

public interface IDocument 
{ 
    void OpenFile(); 
    void DoStuff(); 
    void SaveFile(); 
} 

public class Word : IDocument { .... } 

public function RunTheFunctions(IDocument o) 
{ 
    o.OpenFile(); 
    o.DoStuff(); 
    o.SaveFile(); 
} 
0

做一個接口:

public interface ICommonMethods 
{ 
void OpenFile(); 
void DoStuff(); 
void SaveFile(); 
} 

讓你的類實現它,然後做:

ICommonMethods o = new Word(); 

o.OpenFile(); 
2

而且接口解決方案,這是做了正確的方式,你也可以使用dynamic爲參數的類型,如果.NET框架> = 4.0。如果Word,Excel和Microstation是第三方類並且不共享通用接口或基類,則此解決方案是有意義的。 (其實你可以在這種情況下使用Adapter Pattern和返回的接口解決方案)

public void RunTheFunctions(dynamic o) 
{ 
    o.OpenFile(); 
    o.DoStuff(); 
    o.SaveFile(); 
} 

這將引發在運行時異常,如果所提供的對象不具有相應的方法。

0

假設OpenFile()SaveFile()是所有類相同的操作,你需要的是Template Method Pattern

public abstract class Document 
{ 
    /*Assuming OpenFile and SaveFile are the same for Word, Excel and Microstation */ 

    public void DoStuff() 
    { 
     OpenFile(); 
     DoSpecificStuff(); 
     SaveFile(); 
    } 

    private void OpenFile() 
    { 
     //Open the file here. 
    } 

    protected abstract void DoSpecificStuff() 
    { 
     //Word, Excel and Microstation override this method. 
    } 

    private void SaveFile() 
    { 
     //Save file 
    } 
} 

public class Excel : Document 
{ 

    protected override void DoSpecificStuff() 
    { 
     //Excel does what it needs to do. 
    } 
} 

public class Word : Document 
{ 

    protected override void DoSpecificStuff() 
    { 
     //Word does what it needs to do. 
    } 
} 

然後使用:

public void SomeFunction() 
    { 
     Document document = SelectDocument("xlsx"); 
     document.DoStuff(); //Open file, excel operation then save file. 

     document = SelectDocument("docx"); 
     document.DoStuff(); //Open file, word operation then save file. 
    } 

    public Document SelectDocument(string fileExtension) 
    { 
     switch (fileExtension) 
     { 
      case "docx": return new Word(); 
      case "xlsx": return new Excel(); 
      default: return null; 
     } 
    }