2014-10-03 67 views
4

比方說,我有兩個類:如何在類實例中調用常用函數?

class Batman 
{ 
    public void Robin(){...} 
    public void Jump(){...} 
} 

class Superman 
{ 
    public void Kryptonie(){...} 
    public void Jump(){...} 
} 

現在,我有這些類的一個實例:

public object Crossover() 
{ 
    var batman = new Batman(); 
    var superman = new Superman(); 

    return superman; 
} 

我不知道實例,它類的交叉會返回,也可能是蝙蝠俠或超人。

var someVariableName = Crossover(); //I don't know if this contains an instance of Superman or Batman; 

//I do know that no matter which class instance is returned, it will always contain a function named Jump which i want to trigger: 
someVariableName.Jump(); 

現在我知道我可以這樣做:

if (someVariableName.GetType() == typeof(Superman)) 
{ 
    ((Superman) someVariableName).Jump() 
} 

但有觸發跳轉功能,而無需手動檢查每種類型的if..else的方式..,當我知道保存在該變量中的類的實例將始終包含一個Jump函數?

+0

爲'Crossover'返回'object',該代碼'VAR someVariableName =交叉(); someVariableName.Jump();'只是不會編譯。最好是創建'interface IJumpingEntity {void Jump()}',讓'Batman'和'Superman'實現這個接口,並從'Crossover'返回接口類型的對象。 – 2014-10-03 13:21:31

+0

如果你有一個基類,蝙蝠俠和超人都繼承from,把Jump方法放在那個類中,然後Crossover返回一個基類類型的對象? – 2014-10-03 13:22:12

+7

親愛的15K +代表回答者,你確定這個問題是獨一無二的嗎?難道你不應該花幾秒鐘找到一個參考問題,而不是回答它? – CodeCaster 2014-10-03 13:25:11

回答

3

這是接口變得有用的地方。考慮這個接口:

public interface ISuperhero 
{ 
    void Jump(); 
} 

而這些實現:

class Batman : ISuperhero 
{ 
    public void Robin(){...} 
    public void Jump(){...} 
} 

class Superman : ISuperhero 
{ 
    public void Kryptonie(){...} 
    public void Jump(){...} 
} 

他們是個別實現,但他們都有一個共同的多態接口。然後,您的函數可以返回該接口:

public ISuperhero Crossover() 
{ 
    var batman = new Batman(); 
    var superman = new Superman(); 

    return superman; 
} 

由於該接口具有Jump()方法,它可以直接調用:

var someVariableName = Crossover(); 
someVariableName.Jump(); 
14

使用的接口:

interface ISuperHero 
{ 
    void Jump(); 
} 

class Batman : ISuperHero 
{ 
    public void Robin(){...} 
    public void Jump(){...} 
} 

class Superman : ISuperHero 
{ 
    public void Kryptonie(){...} 
    public void Jump(){...} 
} 

然後從你的方法返回接口:

public ISuperHero Crossover() 
3

你可以創建一個基類中定義的方法(或一個接口,如果它僅僅是對方法定義)。您可以在派生類中覆蓋實現。

abstract class ActionFigure 
{ 
    public abstract void Jump(); // just define it has a Jump method, but implement it in the deriving class 

    public void SomethingGeneral() 
    { 
     // no need for an override, just implement it here 
    } 
} 

class Batman : ActionFigure 
{ 
    public void Robin(){...} 
    public override void Jump(){...} 
} 

class Superman : ActionFigure 
{ 
    public void Kryptonie(){...} 
    public override void Jump(){...} 
} 
相關問題