加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 01:37:26 所属栏目:百科 来源:网络整理
导读:想象一下,我有一个基本实体类的游戏,一个不带参数的init方法.现在我有一个Wizard类,但我希望传递2个参数,比如速度和强度.在AS3中(我相信 Java和C#)我将不被允许这样做 – 它是一个“不兼容的覆盖”,因为方法签名将不匹配.现在我可以改为创建一个“initWizard
想象一下,我有一个基本实体类的游戏,一个不带参数的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;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读