我有这样的功能:
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类型..但最初我使用了字符串类型..现在我想保留两者。
答案 0 :(得分:4)
将myFunc
放入SpecialObject
。如果只关注SpecialObject
,请将其作为其成员函数。
如果无法做到这一点,请让myFunc
以SpecialObject
作为参数,这样您就不必担心构造它了。
答案 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);
}
但是,如果您不控制输入类型的代码(例如框架中内置的string
或Stream
类型),请不要避免重载并保持类型安全。
答案 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);
}
您需要处理传入的错误对象类型。