2011-09-24 23 views
6

Bu sınıfların her ikisi de olayları yükselten başka bir özel sınıf içerir. Bu iki sınıf daha sonra bu olayları istemcilere yeniden yükseltiyor. Gördüğünüz gibiAynı, yinelenen etkinliklerle iki sınıfı nasıl yeniden düzenlersiniz?

public class FirstClass 
{ 
    public delegate void FooEventHandler(string foo); 
    public delegate void BarEventHandler(string bar); 
    public delegate void BazEventHandler(string baz); 

    public event FooEventHandler Foo; 
    public event BarEventHandler Bar; 
    public event BazEventHandler Baz; 

    private PrivateObject privateObject; 

    public FirstClass() 
    { 
     privateObject.Foo += FirstClass_Foo; 
     privateObject.Bar += FirstClass_Bar; 
     privateObject.Baz += FirstClass_Baz; 
    } 

    private void FirstClass_Foo(string foo) 
    { 
     if (Foo != null) 
     { 
      Foo(foo); 
     } 
    } 

    private void FirstClass_Bar(string bar) 
    { 
     if (Bar != null) 
     { 
      Bar(bar); 
     } 
    } 

    private void FirstClass_Baz(string baz) 
    { 
     if (Baz != null) 
     { 
      Baz(baz); 
     } 
    } 
} 

, özel bir nesneden yeniden yükseltmek olaylar vardır:

Maalesef iki sınıfın her bu kodun aynısını sahiptir. Bu gereksizdir. Ben devralma kullanarak ve bir taban sınıfta bu yinelenen kod yerleştirerek çalıştım ama böyle elde hataları tutmak:

olay 'BaseClass.Foo' Yalnızca + = veya sol tarafında görünebilir

- = (hariç tür içinde kullanılan)

Bu yinelenen koddan nasıl kurtulacağını bilen var mı?

cevap

5

Özel nesnenin olaylarını sarıcınızın özellikleri olarak göstermeye ne dersiniz? Eğer C# Özellikleri aşina değilseniz

public class ExternalClass 
{ 
    private InternalClass _internalObject = new InternalClass(); 

    public event InternalClass.someDelegate SomeEvent 
    { 
     add 
     { 
      _internalObject.SomeEvent += value; 
     } 
     remove 
     { 
      _internalObject.SomeEvent -= value; 
     } 
    } 
} 

public class InternalClass 
{ 
    public delegate void someDelegate(string input); 
    public event someDelegate SomeEvent; 
} 

olduğu gibi muhtemelen get ve set kelime biliyorum. add/remove anahtar kelimeler temelde aynı şeydir, yalnızca mülkünüze değer eklemeye veya çıkarmaya çalıştığınızda işten atılırlar.

Bu nedenle, temsilci (0) ExternalClass.SomeEvent'a kaydolmak için komut verdiğinizde, aslında (un) InternalClass.SomeEvent etkinliğine kaydolursunuz.

C# Properties hakkında bilgi sahibi değilseniz, http://msdn.microsoft.com/en-us/library/x9fsa0sw(v=vs.80).aspx size yardımcı olacaktır.

+2

iyi olur etkinliğin adı için OnEvent kullanmamayı tercih. OnEvent olayı yükseltmek/ateşlemek için standart isimdir. Else, cevabın fikrine katılıyorum. –

+0

Düzeltmeniz için çok teşekkür ederim :) – Andrea

+0

Andrea: Cevabınız için teşekkürler! Ne yazık ki bu kodun tam olarak ne olduğunu takip ederek biraz sorun yaşıyorum. "Ekle" ve "kaldır" anahtar kelimelerini hiç duymadım bile. Bu kodu biraz açıklayabilir misiniz? –

0

Bunun sizin için çalışacağını düşünüyorum. Genel arayüz, PrivateObject'in dahili kalmasına izin verir. Diğer tek şey, RegisterifooEvent'lerinin yapıcıda çağrılması gerektiğidir. Konsol uygulamasında

public interface IFooEvents 
{ 
    event BaseClass.FooEventHandler Foo; 
    event BaseClass.BarEventHandler Bar; 
    event BaseClass.BazEventHandler Baz; 
} 

internal class PrivateObject : IFooEvents 
{ 
    public event BaseClass.FooEventHandler Foo; 
    public event BaseClass.BarEventHandler Bar; 
    public event BaseClass.BazEventHandler Baz; 

    public void ChangeFoo(string foo) 
    { 
     if (Foo != null) 
     { 
      Foo(foo); 
     } 
    } 
} 

public abstract class BaseClass : IFooEvents 
{ 
    public delegate void BarEventHandler(string bar); 
    public delegate void BazEventHandler(string baz); 
    public delegate void FooEventHandler(string foo); 

    private IFooEvents _fooEvents; 

    public event FooEventHandler Foo 
    { 
     add { _fooEvents.Foo += value; } 
     remove { _fooEvents.Foo -= value; } 
    } 

    public event BarEventHandler Bar 
    { 
     add { _fooEvents.Bar += value; } 
     remove { _fooEvents.Bar -= value; } 
    } 

    public event BazEventHandler Baz 
    { 
     add { _fooEvents.Baz += value; } 
     remove { _fooEvents.Baz -= value; } 
    } 

    protected void RegisterIFooEvents(IFooEvents fooEvents) 
    { 
     _fooEvents = fooEvents; 
    } 
} 

public class FirstClass : BaseClass 
{ 
    private readonly PrivateObject _privateObject; 

    public FirstClass() 
    { 
     _privateObject = new PrivateObject(); 
     RegisterIFooEvents(_privateObject); 
    } 

    public void ChangeFoo(string foo) 
    { 
     _privateObject.ChangeFoo(foo); 
    } 
} 

test çalışması:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var class1 = new FirstClass(); 
     class1.Foo += EventRaised; 
     class1.ChangeFoo("TEST"); 

    } 

    static void EventRaised(string arg) 
    { 
     Console.WriteLine(arg); 
    } 
} 
İlgili konular