2013-12-19 70 views
2
public <return_type> getclass(string company) 
{ 
    switch (company) 
    { 
     case "cmp1": Classcmp1 temp = new Classcmp1(); return temp ; 
     case "cmp2": Classcmp2 temp = new Classcmp2(); return temp ; 
     case "cmp3": Classcmp3 temp = new Classcmp3(); return temp ; 
    } 
} 

如果classcmp1,classcmp2,classcmp3是三個公共類,該函數的返回類型應該是什麼?如何動態確定這一點?動態確定不同類的函數返回類型?

+0

'object'應該是返回類型 –

+1

您必須爲所有可能的類返回一個祖先。作爲最後一個資源,您可以返回Object。 –

+1

我假設它們是相關的,那麼你可以創建一個接口,讓所有的類實現它並返回它。 –

回答

7

您隨時可以返回一個對象,因爲所有的類都是從對象繼承:

public object getclass(string Company) 
{ 
    switch (Company) 
    { 
     case "cmp1": classcmp1 temp = new classcmp1(); return temp ; 
     case "cmp2": classcmp2 temp = new classcmp2(); return temp ; 
     case "cmp3": classcmp3 temp = new classcmp3(); return temp ; 
    } 
} 

否則,您可以建立一個類從你的三個類將繼承:

public class classcmp { } 
public class classcmp1 : classcmp {} 
public class classcmp2 : classcmp {} 
public class classcmp3 : classcmp {} 

public classcmp getclass(string Company) 
{ 
    switch (Company) 
    { 
     case "cmp1": classcmp1 temp = new classcmp1(); return temp ; 
     case "cmp2": classcmp2 temp = new classcmp2(); return temp ; 
     case "cmp3": classcmp3 temp = new classcmp3(); return temp ; 
    } 
} 

否則,你可以建立一個接口:

public interface Iclasscmp { } 
public class classcmp1 : Iclasscmp {} 
public class classcmp2 : Iclasscmp {} 
public class classcmp3 : Iclasscmp {} 

public Iclasscmp getclass(string Company) 
{ 
    switch (Company) 
    { 
     case "cmp1": classcmp1 temp = new classcmp1(); return temp ; 
     case "cmp2": classcmp2 temp = new classcmp2(); return temp ; 
     case "cmp3": classcmp3 temp = new classcmp3(); return temp ; 
    } 
} 

你會做出的選擇會影響拱門你的程序迭代。由於沒有關於您需要的班級使用情況的更多信息,因此很難爲您提供幫助。

+0

調用上述類中的某個函數,例如classcmp1有一個fn sum(),classcmp2有另一個sub()等,我怎樣才能使用getclass(「cmp2」)。sub() ; – gjijo

3

是否所有的classcmpX類都共享一個通用的類/接口?

  • 如果是這樣,則返回該類型。
  • 如果不是,你可以讓它們擴展/實現一個通用的類/接口嗎?
  • 如果不是,則返回object,這是c#中所有類型擴展的類(*)。

(*)很好,除了指針類型。

1

你的getClass方法必須提供類'不知何故'相關:它們是否實現了通用接口?他們是否都從同一個父類繼承?
你應該做的是讓這個關係是顯式的,那麼你可以使用這個父類或接口作爲你的getClass方法的返回類型。

選擇具有繼承方案vs讓類實現相同的接口是相當隨意的。常見的問題是問自己,如果你的類是'同一件事(繼承),或者它們'具有相同的行爲(接口)「。蘋果和橘子'是'水果,他們'有'的重量,所以他們繼承水果和實施IWeight ...但他們也是'SolidObjects和實施ITasteGood :-)

在你的情況我趨向相信你想做一個父類抽象/虛擬(VB中的MustInherit)你的3個類將繼承的類。

我不明白你的方法是否有相同的簽名(==參數列表)。如果不是這種情況,請記住,您可以通過一個對象發送所有參數,並再次擁有相同的簽名。

((只是爲了記錄在案,你在這裏實現的模式(提供取決於參數類)是工廠模式)。)

+0

我有3個獨立的類說Report1.cs,Report2.cs,Report3.cs ..每個都有相同的功能名稱,但有不同的定義。我需要根據我編輯的公司名稱 – gjijo

+0

來爲上述課程之一調用這些功能以澄清。 – GameAlchemist

3

對象是最通用的retunn類別,你可以試試這個。

此外,您不需要初始化temp,只需create.initliaze對象並將其返回即可。

public object getclass(string Company) 
{ 
    switch (Company) 
    { 
     case "cmp1": return new classcmp1(); 
     case "cmp2": return new classcmp2(); 
     case "cmp3": return new classcmp3(); 
    } 
} 
1

我認爲在你的情況下最好的解決方案將是像Cyril Gandon已經提出的接口。

public interface IClasscmp {} 
public class Classcmp1 : IClasscmp {} 
public class Classcmp2 : IClasscmp {} 
public class Classcmp3 : IClasscmp {} 

public IClasscmp GetClass(string company) 
{ 
    switch (company) 
    { 
     case "cmp1": return new Classcmp1(); 
     case "cmp2": return new Classcmp2(); 
     case "cmp3": return new Classcmp3(); 
    } 
} 

但是,對C#使用正確的命名約定也是一件好事。它支持更好的可讀性,並且這裏的語法突出顯示在stackoverflow上也將起作用。 ;) 請參閱:Naming Convention in c#