2013-06-20 29 views
0

我有这样的功能:同身体功能适用于不同类型的输入的C#

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

} 

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

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

} 

编辑: 因此,这里的事情,我做一个文件处理程序,不仅功能1实际使用Stream对象,我想在锁定文件该mainFunction的时间,所以我认为,如果打开一个文件的保持开放将做的工作,因为我想和这个文件的干扰:

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

现在功能1()是这样的:

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

我可以只使用流类型..但最初我使用的字符串类型..现在我想保持两个。

回答

4

myFunc放在SpecialObject的内部。如果所有关心的是SpecialObject,请将其设为其成员函数。

如果这是不可能的,让myFuncSpecialObject作为它的参数,这样你就不必担心它的构造。

-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); 
} 

你需要处理错误的对象类型中传递

+3

这只是*糟糕*的做法。 – Servy

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类型,这是内置于框架),没有你,以避免重载和维护类型安全。

1

myFunc取而代之的是SpecialObject。如果我更了解情况,我可能会提供一个不同的答案。

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

void myFunc(SpecialObject special) 
{ 
    ... 
} 
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); 
相关问题