是否有另一种方法来创建实例而不使用new

本文关键字:new 实例 创建 另一种 方法 是否 | 更新日期: 2023-09-27 18:06:40

这是我的类employee,另一个来自employee(这只是一个示例类):

public class Employee
{
    public int EmployeeID { get; set; }
    public Type type { get; set; }
    public string Name { get; set; }
}
public class Manager : Employee
{
    public void DoSomething()
    {
        // Bla bla
    }
}
public class Salesman : Employee
{
    public void DoAnotherSomething()
    {
        // Bla bla
    }
}

如您所见,我的Employee类有一个Type属性,它包含Manager或Salesman。我不想使用很多切换用例,所以有办法创建知道类型变量的对象吗?

更新1:

好吧,我是说。在我真正的程序里。我使用了许多切换案例来创建对象:

        Employee employee = new Employee();
        // I do somethings to get the values to employee I store it in a Employee list
        // Then I need to create the particular object of each one, I need to travel all 
        // the list an create its instance
        switch (employee.Type)
        {
            case Manager:
                employee = new Manager();
                // Some stuff
                break;
            case Salesman:
                employee = new Salesman();
                // Some stuff
                break;
        }
在我的实际代码中,我需要使用130个case,或多或少。所以我想实现另一种方法来避免这个

是否有另一种方法来创建实例而不使用new

如果您试图避免切换到设置Type属性,您可以在Employee上定义一个构造函数,将Type作为参数:

protected Employee(Type type) { 
    this.type = type;
}

并从每个子类的构造函数中调用它:

public Manager() : base(typeof(Manager)) { }

此模式通常还要求将Employee声明为抽象类型,这样您就不会意外地创建一个不是已知类型的Employee。如果您希望Employees只是Employees,则可以将其保留为一个具体(非抽象)类,并定义一个调用我建议的新构造函数的构造函数,如下所示:

public Employee() : this(typeof(Employee)) { }

不是继承类Employee,为什么不创建一个接口IEmployee,并有每个"雇员"类型的类,你想创建实现该接口?

永远不要打开类型。这是一种代码气味,表明您错误地使用了OOP。相反,您应该始终努力以多态方式使用您的类。如果我正确理解你的问题,你有一个雇员,并希望使另一个相同类型。这被称为Virtual Constructor习惯用法,通常使用Virtual Clone方法来处理:

class Employee
{
  public virtual Employee Clone();
};
class Manager
{
  public override Manager Clone()
  {
     return new Manager(this);
  }
};

这里听起来像是您希望工厂模式采用一些标识符并创建一个实例,并通过静态方法返回它:

class EmployeeFactory
{
  public static Employee NewEmployee(EmployeeType type)
  {
     Employee emp = null;
     switch (type)
     {
        case EmployeeType.Manager :
           emp = new Manager();
           break;
        case EmployeeType.Salesman :
           emp = new Salesman();
           break;
     }
     return emp;
  }
}

你可以做一个

var factory = new Dictionary<Type, Func<Employee>> {
    Type.Mgr, ()=>new Manager(),
    Type.Sales, ()=>new Salesman()
};

一样使用
var salesman = factory[Type.Sales](); //creates a salesman

(假设这是你的问题所要求的)。但我同意其他海报,如果这是你想要的,这通常被认为是不好的做法。

既然你已经有了这个类型,你可以使用System.Activator ?

Type type = typeof(Manager);  
var manager = (Manager) Activator.CreateInstance(type);

理解商业案例将有助于具体地回答问题。不清楚为什么要实例化一个已经知道类型的对象。与其将类型参数传递给工厂方法,为什么不直接传递一个函数或对象呢?