微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 人们如何绕过需要不同数量的超类参数的子类init方法?

想象一下,我有一个基本实体类的游戏,一个不带参数的init方法.现在我有一个Wizard类,但我希望传递2个参数,比如速度和强度.在AS3中(我相信 Java和C#)我将不被允许这样做 – 它是一个“不兼容的覆盖”,因为方法签名将不匹配.现在我可以改为创建一个“initWizard”方法,但后来我遇到了每个类的init方法可能有不同名称的问题.

我需要在AS3,Java或C#中工作的解决方案.

解决方法

不确定我是否理解你的问题.但是下面用Java编译:

public class A {
    public void init(int a) {}
}

public class B extends A {

    public void init( int a,int b )
    {
        super.init( a );
    }
}

虽然我同意B#init(int,int)不是A#init(int)的重写,但仍然可以调用B#init(int).你无法真正隐藏B#init(int)的存在,你最多可以在B中覆盖它并让它在调用时抛出异常.

然而这是一个大问题吗?方法签名仅捕获必须如何使用类的合同的一部分.如果您想更多地屏蔽代码,可以使用工厂方法创建A或B的实例并使init受保护.

public class A {
    protected void init(int a) {}

    static public A create( int a)
    {
        A o = new A();
        o.init( a );
        return o;
    }
}

public class B extends A {

    protected void init( int a,int b )
    {
        super.init( a );
    }

    static public B create( int a,int b)
    {
        B o = new B();
        o.init( a,b );
        return o;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐