2012-01-22 25 views
5

Dinamik bir şekilde bir winform panelindeki denetimleri çalışma zamanında ekliyorum ve değiştiriyorumFabrika modelindeki arabirimlerle mirasın yerini nasıl alabilirim?

Tüm çalışmalara bir baseUserControl'den miras almak yerine arabirimler uygulamam söylendi bile.

ben arabirimleri benim Fabrikası kodlayacağınıza nasıl

kullanarak aynı sonucu elde edebilirsiniz nasıl ben bunun için tüm değilim ama yok?

Bu nasıl geliştirilebilir ve bunun yerine arayüzler kullanılabilir? İşte

//Simplified noddy example 

//Client code 
var controlA = ControlFactory 
    .Create("UserControlA") as UserControlA; 

panel1.Controls.Add(ControlA); 

//Factory 
public class ControlFactory 
{ 
    public static BaseUserControl Create(string name) 
    { 
     switch (name) 
     { 
      case "UserControlA": 
       var userControlA = new UserControlA(); 

       return userControlA; 

      case "UserControlB": 
       var userControlB = new UserControlB(); 
       return userControlB; 
     } 
     return null; 
    } 
} 
    //BaseUserControl 
    public partial class BaseUserControl : UserControl 
    { 
     public BaseUserControl() 
     { 
      InitializeComponent(); 
     } 

     public virtual void DoSomething() 
     { 

     } 
    } 

    public partial class UserControlA : BaseUserControl 
    { 
     public UserControlA() 
     { 
      InitializeComponent(); 
     } 

     public override void DoSomething() 
     { 
      //Do something here 
     } 
    } 

public partial class UserControlB : BaseUserControl 
{ 
    public UserControlB() 
    { 
     InitializeComponent(); 
    } 

    public override void DoSomething() 
    { 
     //Do something here 
    } 
} 
+0

http://codereview.stackexchange.com/ – GolfWolf

+3

Neden bir soru gibi görünüyor? Temel sınıf üzerinden arayüz kullanmanın avantajı ne olur? – Oded

+0

Bunlar özel değildir. IUserControl'niz DoSomething() öğesini bildirebilir ve BaseControl'ü IUserControl'ü uygulayarak gerçekleştirebilirsiniz (ve bir IUserControl'ü fabrikadan iade edebilirsiniz). – Joe

cevap

7

bunu yapabilirsiniz:

using System; 
using System.Windows.Forms; 
using System.ComponentModel; 

//Interface 
public interface IControl : IComponent 
{ 
    void DoSomething(); 
} 

//Factory 
public class ControlFactory 
{ 
    public static IControl Create(string name) 
    { 
     switch (name) 
     { 
      case "UserControlA": 
       var userControlA = new UserControlA(); 

       return userControlA; 

      case "UserControlB": 
       var userControlB = new UserControlB(); 
       return userControlB; 
     } 
     return null; 
    } 
} 

//BaseUserControl 
public partial class BaseUserControl : UserControl, IControl 
{ 
    public BaseUserControl() 
    { 
     InitializeComponent(); 
    } 

    public virtual void DoSomething() 
    { 

    } 
} 

public partial class UserControlA : BaseUserControl, IControl 
{ 
    public UserControlA() 
    { 
     InitializeComponent(); 
    } 

    public override void DoSomething() 
    { 
     //Do something here 
    } 
} 

public partial class UserControlB : BaseUserControl, IControl 
{ 
    public UserControlB() 
    { 
     InitializeComponent(); 
    } 

    public override void DoSomething() 
    { 
     //Do something here 
    } 
} 

Eğer UserControlA ve UserControlB için ortak herhangi bir işlevi varsa BaseUserControl koruyabilirsiniz; aksi halde, onu ortadan kaldırın ve sonuncusunu doğrudan UserControl'dan alın.

, IControl arabiriminizdeki türetilmiş sınıflarınızdan erişmeniz gerekebilecek tüm üyeleri tanımlamanız gerekir. Bu, UserControl'dan devralacak üyelerin tümünü içerir. Bununla birlikte, bunları beton sınıflarınızda yeniden uygulamanız gerekmeyecektir.

//Interface 
public interface IControl : IComponent 
{ 
    void DoSomething(); 

    // To be inherited from UserControl. 
    Size Size { get; set; } 
    bool Focus(); 
    event EventHandler FontChanged; 
} 

Bir Windows için bu denetimleri eklemek gerekirse

Forms uygulaması - tipik bir Control.ControlCollection.Add yöntem çağrısı bağımsız değişken olarak - Eğer kontrolüne gelen bir Control örneğini almak gerekir. Mevcut uygulama kapsamında, bu sadece döküm yoluyla sağlanabilir; Bununla birlikte, bu, gelecekte uygulanacak olan uygulamayı değiştirmeye karar vermeniz durumunda, arayüzünüzün tüketicilerinden yalıtılmalıdır. Böylece, ben kullanırım:

//Interface 
public interface IControl : IComponent 
{ 
    void DoSomething(); 

    Control AsWindowsForms(); 
} 

//BaseUserControl 
public partial class BaseUserControl : UserControl, IControl 
{ 
    public BaseUserControl() 
    { 
     InitializeComponent(); 
    } 

    public virtual void DoSomething() 
    { 

    } 

    public Control AsWindowsForms() 
    { 
     return this as Control; 
    } 
} 

istemci kodu:

var controlA = ControlFactory.Create("UserControlA").AsWindowsForms(); 
var controlB = ControlFactory.Create("UserControlB").AsWindowsForms(); 
panel1.Controls.Add(controlA); 
panel1.Controls.Add(controlB); 
+0

+1 – radarbob

İlgili konular