【问题标题】:How to access polymorphic methods without a cast in C#如何在 C# 中访问多态方法而不进行强制转换
【发布时间】:2011-08-31 13:29:59
【问题描述】:
class AlphaBase
{
    public bool PropA { get; set; }
}

class AlphaA : AlphaBase
{
    public bool PropB { get; set; }
}

class BetaBase
{
    protected AlphaBase MAlpha;
    public BetaBase(AlphaBase rAlpha)
    {
        MAlpha = rAlpha;
    }

}

class BetaA : BetaBase
{
    public BetaA(AlphaA rAlpha) : base(rAlpha) {}

    void DoSomething()
    {
        if (MAlpha.PropA) ;
        if (MAlpha.ProbB) ;  //wont compile
    }
}

问题:如何在不为 AlphaA 创建第二个变量的情况下完成这项工作。

BetaBase 将使用 MAlpha,BetaB 也将使用 .. 我如何在没有演员表和没有 2 个参考变量的情况下实现这一目标?

谢谢

【问题讨论】:

  • 简答:你不能。
  • 为什么不能使用演员表?无法从基类型调用 PropB,因为基类型 AlphaBase 不知道 PropB。

标签: c# design-patterns object derived-class


【解决方案1】:

为了保证您的代码类型安全,您可以将BetaBase 设为通用:

class BetaBase<TAlphaBase>
    where TAlphaBase : AlphaBase
{
    protected TAlphaBase MAlpha;
    public BetaBase(TAlphaBase rAlpha)
    {
        MAlpha = rAlpha;
    }

}

class BetaA : BetaBase<AlphaA>
{
    public BetaA(AlphaA rAlpha) : base(rAlpha) {}

    void DoSomething()
    {
        if (MAlpha.PropA) ;
        if (MAlpha.PropB) ;  //yay! compiles now
    }
}

【讨论】:

  • 完美!完全没有运行时开销?
  • 泛型被编译为 IL,它应该比 cast 快得多,而且根本没有明显的性能损失。
  • 该死的 - 所以性能受到影响?在 BetaA 中创建对 AlphaA 的第二个引用会更快吗?
  • @jaybny:不,使用泛型应该不会影响性能。
【解决方案2】:
if(MAlpha is AlphaA) {
    // You need to use a cast still
}

如果不对对象进行强制转换,就无法访​​问该对象的属性。如果您只是想知道它是否是 AlphaA 的实例,请使用表达式 ... is AlphaA

【讨论】:

    【解决方案3】:

    MAlpha 的类型为 AlphaBase,它没有布尔属性 PropB。你只能通过演员来做到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-07
      • 2016-11-10
      • 2015-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多