多态性和显式铸造

Ray*_*rof 0 c# polymorphism casting

我有以下架构(类比很糟糕,但W/E).

在此输入图像描述

program其他逻辑类中,我有很多方法使用finger(MonkeyFinger)的特定类型.这意味着我必须明确地转换所有那些testMethods.

是否有任何设计模式/解决方案可以避免显式演员表?

编辑代码:

Monkey govi = new Monkey(...)
Program test = new Program()
test.testFinger1((MonkeyFinger) govi.GetHand.getFinger)
Run Code Online (Sandbox Code Playgroud)

...

Rob*_*Rob 5

你可以尝试这样的事情:

public class Animal<TFingerType> where TFingerType : IFinger
{
    Hand<TFingerType> GetHand() 
    {
        //... Do something
    }
}

public class Monkey : Animal<MonkeyFinger> { }
public class Hand<TFingerType> where TFingerType : IFinger
{

}
public interface IFinger
{

}
public class MonkeyFinger : IFinger {
}
Run Code Online (Sandbox Code Playgroud)

至少在你给出的例子中,Monkey返回包含HumanFingers 的手是没有意义的.手本身实际上由它具有什么类型的手指来定义.

然后你的代码变成:

Monkey govi = new Monkey(...)
Program test = new Program()
test.testFinger1(govi.GetHand.getFinger() /* getFinger here returns a MonkeyFinger */)
Run Code Online (Sandbox Code Playgroud)

请注意,手指仍然是IFingers,并且可以在该上下文中使用,但是这种方法还提供具体类型的手指.