2011-08-23 110 views
0

这是我的类别的雇员,并从员工另一者(这只是一个例子类):有没有使用新的创建一个实例的另一种方法?

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类有一个类型属性,包含经理或业务员。我不想使用许多开关情况,那么是否有办法创建知道类型变量的对象?

UPDATE 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箱子,或多或少。所以我想实现另一种避免这种情况的方法。

+3

根据实例的值创建一个类型的实例?这是否像回到过去一样? –

+3

也许这只是我,但我不明白这个问题。是不是使用'new'创建实例?它试图避免开关情况(开关柜是什么?)?它是关于创建类型变量而不知道它是什么类型?运营机构能否澄清? – Michael

+1

你可以使用'Activator.CreateInstance'创建一个实例,但是我有一种感觉,如果你认为这一点,你并不真的想这样做。你想达到什么目的? –

回答

2

如果你正试图避免切换到设定的类型属性,您可以定义对员工一个构造函数,需要类型作为参数:

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

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

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

此模式通常还要求将Employee声明为抽象,以便您不会意外创建不属于已知类型的Employee。如果你想要的只是员工员工,你可以把它作为一个具体的(非抽象)类,并定义调用新的构造函数,我建议一个构造函数,如下所示:

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

这看起来很不错。虽然我不确定是否必须在Employee中声明Type属性,但无论如何请检查更新。 –

2

而是继承类别的雇员, ,为什么不创建一个接口IEmployee并让每个你想创建的“Employee”类类实现这个接口?

+0

是的,我猜是最好的选择。所以如果我使用该接口。我可以拥有IEmployee列表吗? 检查我的更新请 –

+0

是的,你可以有'List '。如果你需要所有的类类型来共享公共方法,你可以进一步做一个叫做'EmployeeBase'的基类,每个类类型都会继承它。 – Nurvx

+0

请问我会举个例子吗? –

2

你永远不想打开类型。这是你正在使用OOP的代码异味。相反,你应该总是努力多态地使用你的类。如果我正确理解你的问题,你有一个员工,并希望做出另一个相同的类型。这称为虚拟构造函数习惯用法,通常用虚拟克隆方法处理:

class Employee 
{ 
    public virtual Employee Clone(); 
}; 

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

或类似的东西。

1

你可以做一个

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

而且使用它像

var salesman = factory[Type.Sales](); //creates a salesman 

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

2

像你想有一个工厂模式采取一些descriminator并创建一个实例,并通过一个静态方法返回它在这里的声音:

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; 
    } 
} 
1

正如你已经具有类型,你可以使用System.Activator

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

了解商业案例将有助于明确回答。目前还不清楚为什么你想实例化一个你已经知道类型的对象。为什么不直接传入Func或对象而不是将Type参数传递给工厂方法?

相关问题