如何在 C# 中访问多态方法而不进行强制转换

发布于 2024-11-09 03:29:32 字数 581 浏览 0 评论 0原文

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
    }
}

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

将使用 MAlpha,BetaB 也将使用。如何在没有强制转换和 2 个引用变量的情况下实现这一目标?

谢谢

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
    }
}

Question: how do make this work, without creating a second variable for AlphA..

BetaBase will be using MAlpha and so will BetaB.. how do I achieve this without a cast and without 2 reference variables?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

小嗷兮 2024-11-16 03:29:33

MAlpha 的类型为 AlphaBase,它没有布尔属性 PropB。您只能通过强制转换来执行此操作。

MAlpha is of type AlphaBase, which does not have a boolean property PropB. You can only do this via cast.

风追烟花雨 2024-11-16 03:29:32

为了保证代码类型的安全,您可以将 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
    }
}

To keep your code type safe, you can make BetaBase generic as such:

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
    }
}
她比我温柔 2024-11-16 03:29:32
if(MAlpha is AlphaA) {
    // You need to use a cast still
}

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

if(MAlpha is AlphaA) {
    // You need to use a cast still
}

It's not possible to access properties of an object without a cast to that object. If you're just wanting to know if it's an instance of AlphaA, use the expression ... is AlphaA.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文