是否有另一种方法来创建实例而不使用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,或多或少。所以我想实现另一种方法来避免这个
如果您试图避免切换到设置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);
理解商业案例将有助于具体地回答问题。不清楚为什么要实例化一个已经知道类型的对象。与其将类型参数传递给工厂方法,为什么不直接传递一个函数或对象呢?