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

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...