2009-09-04 8 views
1

J'ai un UserControl qui a un objet BaseClass en tant que membre public. En ce moment je suis en train de faire ce qui suit pour discerner entre le type d'objet que je dois instancier:Polymorphisme du constructeur Aide

Public WithEvents theForm As OrderForm 

Protected Sub Page_Load(ByVal sender As Object, _ 
    ByVal e As System.EventArgs) Handles Me.Load 

    Select Case Form 
     Case OrderItem.ItemsFor.Invoice 
      theForm = New Invoice(FormID) 
     Case OrderItem.ItemsFor.PurchaseOrder 
      theForm = New PurchaseOrder(FormID) 
    End Select 

End Sub 

Lorsque les deux Invoice et PurchaseOrder Hériter OrderForm que leur classe de base et FormID est un entier. Je sais que c'est faux, mais je voudrais savoir la bonne façon de le faire.

Répondre

2

Normalement, je voudrais supprimer la logique du code derrière et créer une usine abstraite simple. Le but d'une fabrique abstraite est de créer des objets du même type de base mais peut discerner quel type créer à partir d'un discriminateur. Un exemple simple en C# est décrit ci-dessous:

public class OrderFormFactory 
{ 
    public static IOrderForm Create(string orderType, int formId) 
    { 
     IOrderType orderTypeToCreate = null; 
     switch(orderType) 
     { 
      case OrderType.Invoice: 
       orderTypeToCreate = new Invoice(formId); 
       break; 
      case OrderType.PurchaseOrder: 
       orderTypeToCreate = new PurchaseOrder(formId); 
       break; 
      default: 
       throw new ArgumentException("Order Type of " + orderType + " is not supported"; 
     } 
     return orderTypeToCreate; 
    } 
} 
+0

Je n'ai pas d'interface IOrderForm ... si je retournais la BaseClass, cela fonctionnerait-il encore? – Jason

+0

Oui, ça marchera toujours, j'utilisais juste l'interface comme exemple. –