C# 有没有其他方法可以不使用new创建实例?
这是我的类employee,另一个来自employee,这只是一个示例类:C# 有没有其他方法可以不使用new创建实例?,c#,oop,C#,Oop,这是我的类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() {
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或saller。我不想使用很多开关情况,所以有没有办法在知道类型变量的情况下创建对象
更新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个案例,或多或少。因此,我想实现另一种方法来避免这种情况。如果您试图避免切换到设置Type属性,您可以在Employee上定义一个构造函数,该构造函数将Type作为参数:
protected Employee(Type type) {
this.type = type;
}
并从每个子类的构造函数调用它:
public Manager() : base(typeof(Manager)) { }
此模式通常还要求将Employee声明为抽象,这样您就不会意外地创建一个类型未知的Employee。如果希望雇员只是雇员,可以将其作为一个具体的非抽象类,并定义一个调用我建议的新构造函数的构造函数,如下所示:
public Employee() : this(typeof(Employee)) { }
与其继承类Employee,为什么不创建一个接口IEEmployee并让您要创建的每个Employee类型类实现该接口?您永远不想打开类型。这是错误使用OOP的代码味道。相反,您应该始终努力以多态方式使用类。如果我没弄错你的问题,你有一个员工,想再做一个相同类型的员工。这称为虚拟构造函数习惯用法,通常使用虚拟克隆方法处理:
class Employee
{
public virtual Employee Clone();
};
class Manager
{
public override Manager Clone()
{
return new Manager(this);
}
};
或者类似的事情。你可以
var factory = new Dictionary<Type, Func<Employee>> {
Type.Mgr, ()=>new Manager(),
Type.Sales, ()=>new Salesman()
};
假设这就是你的问题所要求的。但我同意其他海报,如果这是您所要求的,通常认为这是一种不好的做法。这里听起来您希望工厂模式使用一些描述符,创建一个实例,并通过静态方法返回它:
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;
}
}
因为您已经拥有了该类型,所以可以使用System.Activator 类型=管理者的类型; var manager=manager Activator.CreateInstancetype;
理解商业案例将有助于具体回答问题。不清楚为什么要实例化一个已经知道类型的对象。与其将类型参数传递给factory方法,为什么不直接传递Func或对象?基于实例的值创建类型的实例?这就像时光倒流吗?也许只是我,但我不明白这个问题。它是关于在不使用新实例的情况下创建实例的吗?它是否试图避免开关箱什么开关箱?是关于在不知道类型的情况下创建类型变量吗?OP能澄清一下吗?你可以用Activator.CreateInstance创建一个实例,但我有一种感觉,如果你仔细想想,你真的不想这么做。你想实现什么?你能解释类型属性的意图吗?对象的声明类型始终可以使用then GetType方法解析。似乎你想在剂量测定法周围使用多态性?你为什么这样做?那是什么类型的?您已经有了一种或另一种类型的具体派生对象。你可以通过简单的is检查在代码中测试它们是什么。这看起来是一个很好的实践。虽然我不确定是否必须在Employee中声明Type属性,但请检查更新。是的,我想这是最好的选择。所以如果我使用这个接口。能给我一份员工名单吗?请检查我的更新,你可以有一个列表。如果您需要所有类类型共享公共方法,您可以更进一步,拥有一个名为EmployeeBase的基类,每个类类型都将继承该基类。请给我一个示例
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;
}
}