在没有构造函数参数的情况下创建 class 的变量

Create variable of class without the parameters of it's constructor

我有一个带有构造函数和一些参数的 BaseClass,然后我想根据枚举创建一个派生的 class 或另一个(该 BaseClass 的)策略,但具有相同的参数。有什么方法可以重构这个吗?谢谢!

public enum GameMode
{
    ModeA,
    ModeB
}

public abstract class BaseClass
{
    public BaseClass(int a, string b, char c)
    {
        
    }
}

public class FirstGameMode : BaseClass
{
    public FirstGameMode(int a, string b, char c) : base(a, b, c)
    {
        
    }
}

public class SecondGameMode: BaseClass
{
    public SecondGameMode(int a, string b, char c) : base(a, b, c)
    {
    }
}

public class TestingPurpose
{
    private GameMode _gameMode;
    private BaseClass _baseClass;
    
    public void Init()
    {
        if (_gameMode == GameMode.ModeA)
        {
            // They use the same variables !
            _baseClass = new FirstGameMode(5, "Hello", 'c');
        }
        else
        {
            // They use the same variables !
            _baseClass = new SecondGameMode(5, "Hello", 'c');
        }
    }
}

我尝试了一些反思,但还是做不到。

我想要类似的东西

    public void Init()
    {
        BaseMatchMode type;
        if (_gameMode == GameMode.ModeA)
        {
            type = typeof(FirstGameMode);
        }
        else
        {
            type = typeof(SecondGameMode);

        }
        _baseClass = new type(5, "Hello", 'c');
    }

您可以使用工厂委托方法;

Func<int a, string b, char c, BaseClass> factory;
if (_gameMode == GameMode.ModeA)
{
      factory= (a, b, c) => new FirstGameMode(a, b, c);
}
else
{
    factory= (a, b, c) => new SecondGameMode(a, b, c);
}
_baseClass = factory(5, "Hello", 'c');

对于这样一个简单的示例,跳过工厂方法并直接创建对象可能会更容易。但是如果你想在组件之间添加一些抽象,这种技术有时很有用。

您还可以创建工厂 class 而不是仅使用委托。还有依赖注入 (DI) / 控制反转 (IoC) 框架,旨在解决指定 interfaces/base class 其他组件应该使用什么实现的问题。