2010-10-04 15 views
6

Bir çeviri sınıfı olarak düşündüğüm şeyi oluşturmaya çalışıyorum, böylece programım çeşitli hedef platformlarla konuşabilir. Her platform soyut bir sınıfın ayrı bir uygulamasıyla ele alınacaktır. Basitlik uğruna işleri hallettim. Türetilmiş soyut sınıflardaki olayların uygulanmasını zorlama

soyut yöntemlerle bir çift, soyut bir sınıf var: Daha sonra

abstract class ControllerBase 
{ 
    public abstract bool EnableDTMFDetection(string CallID, Party Party); 
    public abstract bool DisableDTMFDetection(string CallID, Party Party); 
} 

bir sınıf ControllerBase türetilen (sınıflar) ve tamamen bu yöntemleri uygulamak: Şimdiye kadar

class PlatformOne : ControllerBase 
{ 
    public override bool EnableDTMFDetection(string CallID, Party Party) 
    { 
     // Do Stuff 
     return true; 
    } 

    public override bool DisableDTMFDetection(string CallID, Party Party) 
    { 
     // Do Stuff 
     return true; 
    } 
} 

çok iyi. PlatformOne için, bu yöntemlerin her birini tanımlamak zorundayım, hedef platformuma giden bir mesajı nasıl göndereceğimi reçete ediyorum.

Beni ele geçiren gelen olaylar. Türetilmiş sınıflarımdan olayları geliştirmem gerekiyor. Ben eklediğinizde controllerbase için aşağıdaki:

public delegate void MyEventHandler(object sender, EventArgs e); 
    public event MyEventHandler MyEvent; 

O iyi derler ama hatasız benim türetilmiş sınıf içinde gelen olayı büyütemem: "Olay 'ControllerBase.MyEvent' sadece sola görünebilir + = veya - = (('ControllerBase' türünde kullanıldığında hariç) el tarafı "

Yani, a) Etkinliğimi türetilmiş sınıfımdan nasıl geliştirebilirim? b) Herkes için bir mekanizma önerebilir türetilmiş sınıfımdaki belirli olayların kablolanmasını zorlaştırmak (bir soyut fonksiyon veya arayüz metodu). Aradığınızda ederiz :)

+0

Olayların nasıl yükseltileceğini okumanız gerektiği gibi görünüyor. Ayrıca, "MyEvent" ile ilgili kodu eklerseniz, bu soruya cevap vermede yardımcı olabilir. – Nayan

cevap

10

Bunu yapmanın en basit yolu onu yükseltmek için temel sınıftaki bir yöntemi yazmaktır:

protected void OnMyEvent(EventArgs e) 
{ 
    // Note the copy to a local variable, so that we don't risk a 
    // NullReferenceException if another thread unsubscribes between the test and 
    // the invocation. 
    EventHandler handler = MyEvent; 
    if (handler != null) 
    { 
     handler(this, e); 
    } 
} 

Sen may geçersiz kılmak, böylece bunu bir sanal yöntemi yapmak isteyen türetilmiş sınıflarda ... kullanım durumunuza göre değişir.

Not: Bu , türetilmiş sınıftaki herhangi bir şeyin uygulanmasını zorlayan değil, ama gerçekten istediğiniz şeyi düşünüyorum.

+0

Jon - cevabınız için teşekkür ederim - örneğinizde, EventHander'ın MyEvent örneğini nerede ve nasıl öneriyorsunuz? –

+0

@Adrian: Sorunuzun altında gösterildiği gibi, bunu temel sınıftaki alan benzeri bir etkinlik olarak ilan edebilirsiniz. –

+0

Jon - Şu an çalıştığım şeylerin olduğuna inanıyorum ve size çok teşekkür ediyorum. İki soru kaldı: Tam olarak anlatıldığı gibi yapıldığında, "var handler = MyEvent;" "EventHandler işleyicisi = Etkinliğim" in tersine, ve ikincisi, türetilmiş sınıfımda bunu neden yapamayacağımı anlayamıyorum. Temel olarak, ilk "Olay" ControllerBase.MyEvent 'için bir açıklama görünebilir. + = veya - = "hatasının sol tarafında. –

1

Soyut sınıfta korumalı bir olay başlatıcı oluşturun.

public abstract event MyEventHandler MyEvent; 

rağmen:

protected void InvokeMyEvent(EventArgs args) 
{ 
    var handler = MyEvent; 
    if (hander != null) 
     handler(this, args); 
} 
3

standart model olayları soyut veya sanal yapılabilir

protected virtual OnMyEvent(EventArgs e) { 
    var h = MyEvent; 
    if (h != null) 
     h(this, e); 
} 

Ayrıca akılda tutulması, etkinliği artırmak için bir On<EventName> sanal korumalı yöntemi eklemektir Bu, genellikle tam gereksinimlerinize bağlı olarak ControllerBase için daha iyi olabilecek arayüzlerde kullanılır:

public interface IController { 
    event MyEventHandler MyEvent; 
    bool EnableDTMFDetection(string CallID, Party Party); 
    bool DisableDTMFDetection(string CallID, Party Party); 
} 

public PlatformOne : IControllerBase 

    // yadda yadda... 

    public event MyEventHandler MyEvent; 

    // members of PlatformOne can invoke MyEvent as a normal delegate 
} 
İlgili konular