2011-08-23 111 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參數傳遞給工廠方法?

相關問題