相同的body函数适用于不同类型的输入c#

时间:2013-06-20 15:51:16

标签: c#

我有这样的功能:

 void myFunc(String path)
{
SpecialObject special1 = new SpecialObject(path);

}

现在,我的特殊对象有几个构造函数的重载,例如它也可以将流作为输入。 如何避免需要其他功能,如:

void myFunc(Stream stream)
{
SpecialObject special1 = new SpecialObject(stream);

}

编辑: 所以这就是事情,我正在做一个文件处理例程,只有function1实际上使用了Stream对象,我想在mainFunction的持续时间内锁定文件,所以我认为如果打开一个文件,保持它打开就会做工作,因为我想干涉这个文件:

mainFunction(string inputFile)
{
    Stream stream = new FileStream(inputFile,FileMode.Open);
    Function1();
    Function2();
    Function3();
    Function4();
    stream.Close();
}

现在Function1()是这样的:

Function1()
{
    PDFProcessor processor = new PDFProcessor();
    processor.addDataSrc(new PDFDataSource(STRING OR STREAM));
    processor.Work();
}

我可以使用Stream类型..但最初我使用了字符串类型..现在我想保留两者。

5 个答案:

答案 0 :(得分:4)

myFunc放入SpecialObject。如果只关注SpecialObject,请将其作为其成员函数。

如果无法做到这一点,请让myFuncSpecialObject作为参数,这样您就不必担心构造它了。

答案 1 :(得分:1)

myFunc代替SpecialObject。如果我对这种情况了解得更多,我可能会提供不同的答案。

myFunc(new SpecialObject(path));
myFunc(new SpecialObject(stream));

void myFunc(SpecialObject special)
{
  ...
}

答案 2 :(得分:0)

如果您控制输入类型的代码,则可以使用接口或基类:

public interface ISpecialObjectCreateable { ... }

public MyClassA : ISpecialObjectCreateable { ... }

public MyClassB : ISpecialObjectCreateable { ... }

public class SpecialObject
{
    public SpecialObject(ISpecialObjectCreatable createable)
    {
       ...
    }
}

现在您可以将MyFunc定义为:

void myFunc(ISpecialObjectCreateable createable)
{
    SpecialObject special1 = new SpecialObject(createable);

}

但是,如果您不控制输入类型的代码(例如框架中内置的stringStream类型),请不要避免重载并保持类型安全。

答案 3 :(得分:0)

public void myFunc (Stream aStream = null, String aString = null) {
    aStream?? processor.addDataSrc(new PDFDataSource(aString));
    aString?? processor.addDataSrc(new PDFDataSource(aStream));
}

在客户端代码中,为了清晰起见,您可以使用命名参数。

myFunc(aStream: thisStream);
myfunc(aString: thisString);

当然我们可以抛出myFunc曲线;将不得不检查。

myFunc(thisStream, thisString);

答案 4 :(得分:-2)

你可以做到

void myFunc(Object obj)
{
    SpecialObject special1 = null;
    if (obj is string)
        special1 = new SpecialObject(obj as string);
    else if (obj is Stream)
        special1 = new SpecialObject(obj as Stream);
}

您需要处理传入的错误对象类型。