0

我有一个问题,我不知道如何攻击。希望有人能把我踢向正确的方向。=)

我创建了一些类,即 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();

但它不起作用。

我希望我的问题比较清楚。=)

问候,小号

4

5 回答 5

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();
}
于 2013-04-20T13:36:11.300 回答
2

dynamic除了接口解决方案,这是正确的方法,如果 .NET Framework >= 4.0 ,您也可以用作参数类型。如果 Word、Excel 和 Microstation 是第三方类并且不共享公共接口或基类,则此解决方案是有意义的。(其实这种情况下可以使用Adapter Pattern,返回接口解决方案)

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

如果提供的对象没有相应的方法,这将在运行时引发异常。

于 2013-04-20T13:44:28.537 回答
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);
于 2013-04-20T13:36:30.667 回答
0

假设OpenFile()SaveFile()是所有类的相同操作,您需要的是模板方法模式

 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;
        }
    }
于 2013-04-20T15:09:20.507 回答
0

做一个界面:

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

让你的类实现它,然后执行:

ICommonMethods o = new Word();

o.OpenFile();
于 2013-04-20T13:36:40.993 回答