相同的主体函数适用于不同类型的输入c#
我有这样一个函数:相同的主体函数适用于不同类型的输入c#,c#,C#,我有这样一个函数: void myFunc(String path) { SpecialObject special1 = new SpecialObject(path); } Function1() { PDFProcessor processor = new PDFProcessor(); processor.addDataSrc(new PDFDataSource(STRING OR STREAM)); processor.Work(); } 现在,我的特殊
void myFunc(String path)
{
SpecialObject special1 = new SpecialObject(path);
}
Function1()
{
PDFProcessor processor = new PDFProcessor();
processor.addDataSrc(new PDFDataSource(STRING OR STREAM));
processor.Work();
}
现在,我的特殊对象有几个构造函数的重载,例如,它也可以将流作为输入。
如何避免需要其他功能,如:
void myFunc(Stream stream)
{
SpecialObject special1 = new SpecialObject(stream);
}
编辑:
我在做一个文件处理例程,只有function1实际使用了Stream对象,我想在Main函数的持续时间内锁定文件,所以我认为如果打开一个文件,保持它打开,就可以完成任务,因为我想干扰这个文件:
mainFunction(string inputFile)
{
Stream stream = new FileStream(inputFile,FileMode.Open);
Function1();
Function2();
Function3();
Function4();
stream.Close();
}
现在Function1()是这样的:
void myFunc(String path)
{
SpecialObject special1 = new SpecialObject(path);
}
Function1()
{
PDFProcessor processor = new PDFProcessor();
processor.addDataSrc(new PDFDataSource(STRING OR STREAM));
processor.Work();
}
我可以使用流类型。。但最初我使用的是字符串类型。。现在我想把两者都保留下来。把
myFunc
放在SpecialObject
里面。如果它只关心SpecialObject
,那么将其作为它的成员函数
如果不可能,让
myFunc
将SpecialObject
作为其参数,这样您就不必担心构造它。将myFunc
放入SpecialObject
中。如果它只关心SpecialObject
,那么将其作为它的成员函数
如果不可能,让myFunc
将SpecialObject
作为其参数,这样您就不必担心构造它了。您可以这样做
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);
}
您需要处理传入的错误对象类型。您可以这样做
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);
}
您需要处理传入的错误对象类型。如果您控制输入类型的代码,则可以使用接口或基类:
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
类型),则无法避免重载和维护类型安全 如果控制输入类型的代码,则可以使用接口或基类:
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
类型),则无法避免重载和维护类型安全 让myFunc
取而代之的是SpecialObject
。如果我对情况了解得更多,我可能会给出不同的答案
myFunc(new SpecialObject(path));
myFunc(new SpecialObject(stream));
void myFunc(SpecialObject special)
{
...
}
让
myFunc
取而代之的是SpecialObject
。如果我对情况了解得更多,我可能会给出不同的答案
myFunc(new SpecialObject(path));
myFunc(new SpecialObject(stream));
void myFunc(SpecialObject special)
{
...
}
在客户端代码中,为了清晰起见,可以使用命名参数
myFunc(aStream: thisStream);
myfunc(aString: thisString);
当然,我们可以抛出myFunc
曲线;我必须检查一下
myFunc(thisStream, thisString);
在客户端代码中,为了清晰起见,可以使用命名参数
myFunc(aStream: thisStream);
myfunc(aString: thisString);
当然,我们可以抛出myFunc
曲线;我必须检查一下
myFunc(thisStream, thisString);
这只是一个糟糕的练习。