2013-06-20 64 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); 
相關問題