首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于条件的继承构造函数选择

基于条件的继承构造函数选择
EN

Stack Overflow用户
提问于 2018-05-31 07:16:31
回答 2查看 37关注 0票数 4

我有一组继承的类。根据初始化变量类型,我需要调用相应的构造函数。我想在这里避免使用切换分支,以防武器类型会越来越多。也许有通用的方法或某种模式来实现这一点?武器初始化:

代码语言:javascript
运行
复制
switch (_weaponsData.WeaponType) 
{
    case WeaponType.ProjectileWeapon:
    weapon = new ProjectileWeapon(_weaponsData);
    break;

    case WeaponType.Laser:
    weapon = new LaserWeapon(_weaponsData);
    break;

    case WeaponType.snowBall:
    weapon = new SnowballWeapon(_weaponsData);
    break;
}

自定义武器的构造函数:

代码语言:javascript
运行
复制
public class ProjectileWeapon : BasicWeapon
{
    public ProjectileWeapon(WeaponData weaponData) : base(weaponData) { }
}

public class LaserWeapon : BasicWeapon
{
    public LaserWeapon(WeaponData weaponData) : base(weaponData) { }
}

public class SnowballWeapon : BasicWeapon
{
    public SnowballWeapon(WeaponData weaponData) : base(weaponData) { }
}
EN

回答 2

Stack Overflow用户

发布于 2018-05-31 07:21:30

这类事情是不可避免的,但是如果你真的想要避免case switch结构,你可以使用一个委托字典,其中键是类型,值是Func<BasicWeapon>

代码语言:javascript
运行
复制
var map = new Dictionary<WeaponType,Func<WeaponData,BasicWeapon>>
{
    { WeaponType.ProjectileWeapon, d => new ProjectileWeapon(d) },
    { WeaponType.LaserWeapon,      d => new LaserWeapon(d) },
    { WeaponType.SnowballWeapon,   d => new SnowballWeapon(d) },
};

然后,要创建一个新的武器对象,只需调用

代码语言:javascript
运行
复制
weapon = map[_weaponsData.WeaponType](_weaponsData);
票数 6
EN

Stack Overflow用户

发布于 2018-05-31 07:57:37

在基类中定义静态方法来处理新实例的创建:

代码语言:javascript
运行
复制
public class BasicWeapon
{
    public static BasicWeapon CreateNew(WeaponData _weaponsData)
    {
        // As @Gusman said in comments, if you store Type of classes in 
        // _weaponsData, then you can use :
        // return Activator.CreateInstance(_weaponsData.Type, _weaponsData);
        // Or:
        switch (_weaponsData.WeaponType)
        {
            case WeaponType.ProjectileWeapon:
                return new ProjectileWeapon(_weaponsData);
            case WeaponType.Laser:
                return new LaserWeapon(_weaponsData);
            case WeaponType.snowBall:
                return new SnowballWeapon(_weaponsData);
            default: return null;
        }
    }
}

在你想要的任何地方,你可以使用:

代码语言:javascript
运行
复制
var weapon = BasicWeapon.CreateNew(_weaponsData);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50614549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档