0

我有这样的功能:

 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 类型.. 但最初我使用的是 string 类型.. 现在我想保留两者。

4

5 回答 5

4

放在myFunc里面SpecialObject。如果它只关心SpecialObject,则使其成为它的成员函数。

如果这是不可能的,myFunc请将 aSpecialObject作为其参数,这样您就不必担心构建它。

于 2013-06-20T15:53:44.400 回答
1

取而代之。myFunc_ SpecialObject如果我对情况了解更多,我可能会提供不同的答案。

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

void myFunc(SpecialObject special)
{
  ...
}
于 2013-06-20T15:57:20.280 回答
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);

}

但是,如果您不控制输入类型的代码(例如string,或Stream内置在框架中的类型),那么您可以避免重载并维护类型安全。

于 2013-06-20T15:56:57.797 回答
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);
于 2013-06-21T14:49:03.333 回答
-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);
}

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

于 2013-06-20T15:54:31.660 回答