首页 > 解决方案 > 如何告诉一个类它应该创建哪些对象?类型与对象混淆:(

问题描述

我有一个想要(以某种方式)处理规则的类(SetOfRules)。任务:创建这个类的新实例(这很容易),然后将规则(定义在类Rules 和派生类中)添加到实例中。

问题 1:我不想实例化所有规则,然后将它们作为对象传递给 SetOfRules 的 Add-method,但我想将类名称(类型)列表传递给 Add-method。我怎么做?那么在 SetOfRules 中实例化这样一个对象的语法是怎样的呢?

问题2:类规则和派生类不包含任何属性。它们只是转换方法的集合。我是否必须将它们实例化为 SetOfRules 类中的一个对象,或者我可以将它们称为静态类的方法(我不能使用静态类,因为我在 Rule 类上使用继承来确保每个规则类都实现了需要)

这是我现在遇到的一些(伪)代码:

public class Rule
{
    virtual void transform( myObject ob)
    {
        ...
    }
}

public class SpecificRule1 : Rule
{
    ...
}

public class SpecificRule2 : Rule
{
    ...
}



public class SetOfRules
{
    public AddRules( ???? ListOfRuleTypes)
    {
    }
}

在其他地方我想做类似的事情:

SetOfRules easyRules = new SetOfRules();
easyRules.Add( new ??RuleTypes??[] { "SpecificRule2", "SpecificRule13", "SpecificRule22" });

感谢您的酷提示!

标签: c#methodstypes

解决方案


看起来您想要一个带有合同的单例类:

public interface IRule
{
    void Transform(object o);
}
public abstract class SingletonBase<T> where T : SingletonBase<T>, new()
{
    public static T Instance { get; } = new T();
}
public class SpecificRule1 : SingletonBase<SpecificRule1>, IRule
{
    public void Transform(object o) => throw new NotImplementedException();
}
public class SpecificRule2 : SingletonBase<SpecificRule2>, IRule
{
    public void Transform(object o) => throw new NotImplementedException();
}
public class RuleSet : List<IRule>
{
    public void Add<TRule>() where TRule : SingletonBase<TRule>, IRule, new()
    {
        this.Add(SingletonBase<TRule>.Instance);
    }
}

您可以通过各种方式添加规则:

var rules = new RuleSet
{
    SpecificRule1.Instance,
    SpecificRule2.Instance,
};

rules = new RuleSet();
rules.Add(SpecificRule1.Instance);
rules.Add<SpecificRule2>();

推荐阅读