我有一组继承的类。根据初始化变量类型,我需要调用相应的构造函数。我想在这里避免使用切换分支,以防武器类型会越来越多。也许有通用的方法或某种模式来实现这一点?武器初始化:
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;
}
自定义武器的构造函数:
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) { }
}
发布于 2018-05-31 07:21:30
这类事情是不可避免的,但是如果你真的想要避免case switch
结构,你可以使用一个委托字典,其中键是类型,值是Func<BasicWeapon>
。
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) },
};
然后,要创建一个新的武器对象,只需调用
weapon = map[_weaponsData.WeaponType](_weaponsData);
发布于 2018-05-31 07:57:37
在基类中定义静态方法来处理新实例的创建:
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;
}
}
}
在你想要的任何地方,你可以使用:
var weapon = BasicWeapon.CreateNew(_weaponsData);
https://stackoverflow.com/questions/50614549
复制相似问题