是否有一种设计模式可以将派生对象传递给基类方法而不进行强制转换?

发布于 2024-10-30 14:01:02 字数 365 浏览 1 评论 0原文

是否有一种设计模式可以将以下代码重构为编译时类型安全的代码(即无类型转换)?

public abstract class Base1 {
    public abstract void DoStuff(Base2 b);
}

public class Specific1 : Base1 {
    public override void DoStuff(Base2 b) {
        var s = (Specific2)b;
        // do clever things with s
    }
}

public abstract class Base2 { }
public class Specific2 : Base2 { }

Is there a design pattern that can refactor the following code into something that is type safe at compile-time (i.e. no type casting)?

public abstract class Base1 {
    public abstract void DoStuff(Base2 b);
}

public class Specific1 : Base1 {
    public override void DoStuff(Base2 b) {
        var s = (Specific2)b;
        // do clever things with s
    }
}

public abstract class Base2 { }
public class Specific2 : Base2 { }

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

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

发布评论

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

评论(3

风吹过旳痕迹 2024-11-06 14:01:02

看起来您可能需要在这里考虑双重调度,即调用b。 Specific1#DoStuff() 中的 DoStuff()。 Base1 不应该对如何处理其他类变得太聪明。

Looks like you might want to consider double dispatch here, i.e. have a call to b.DoStuff() in Specific1#DoStuff(). Base1 shouldn't become too clever about what to do with other classes.

热情消退 2024-11-06 14:01:02

在Java中你可以这样做:

public abstract class Base1<T extends Base1> {
public abstract void DoStuff(T b);
}

public class Specific1 extends Base1<Specific2> {
    public override void DoStuff(T b) {
        var T = b;
        // do clever things with s
    }
}

In Java you can do:

public abstract class Base1<T extends Base1> {
public abstract void DoStuff(T b);
}

public class Specific1 extends Base1<Specific2> {
    public override void DoStuff(T b) {
        var T = b;
        // do clever things with s
    }
}
山人契 2024-11-06 14:01:02

如果您想要访问 Specific2 中引入的特定方法(因此未在其基类 Base2 中定义),则除了强制转换之外别无选择。

除非,您使用泛型(在 C# fe 中):

public abstract class Base1<T> where T : Base2
{
    public abstract void DoStuff( T b );
}

public class Specific1 : Base1<Specific2>
{
    public override void DoStuff( Specific2 b ) {}
}

但是,这当然会对您的 Specific1 类造成限制,即您只能将 Specific2 实例传递给 >DoStuff 方法。

If you want to access specific methods that are introduced in Specific2 (and thus not defined in its base class, Base2), you have no other option than to cast it.

Unless, you use generics (in C# f.e.):

public abstract class Base1<T> where T : Base2
{
    public abstract void DoStuff( T b );
}

public class Specific1 : Base1<Specific2>
{
    public override void DoStuff( Specific2 b ) {}
}

But, this puts a limitation on your Specific1 class of course, that is you can only pass Specific2 instances to the DoStuff method.

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