2013-01-24 11 views
9

W języku C# klas i interfejsów może mieć event s:Co znajduje się idiomatyczne równowartość w Scala dla C# 's imprez

public class Foo 
{ 
    public event Action SomethingHappened; 

    public void DoSomething() 
    { 
     // yes, i'm aware of the potential NRE 
     this.SomethingHappened(); 
    } 
} 

Ułatwia to zgłoszenie z minimalnym kodu boilerplate push oparte i umożliwia model wielu abonentów tak że wielu obserwatorów może wysłuchać zdarzenia:

var foo = new Foo(); 
foo.SomethingHappened +=() => Console.WriteLine("Yay!"); 
foo.DoSomething(); // "Yay!" appears on console. 

Czy w Scali występuje odpowiednik idiomu? Co szukam jest:

  1. Minimal boilerplate kod
  2. pojedyncze wydawcy, wielu abonentów
  3. dołączeniu/odłączeniu abonentów

przykłady jej zastosowania w dokumentacji Scala byłoby wspaniałe. Nie szukam realizacji zdarzeń C# w Scali. Zamiast tego szukam odpowiednika idiomu w Scali.

+1

ten może być pomocny: http://stackoverflow.com/questions/6814246/in-scala-how-would-i-combine-event-driven-programming-with-a-functional-approac – daryal

Odpowiedz

2

Idiomatycznym sposobem na scalę nie jest stosowanie wzorca obserwatora. Zobacz Deprecating the Observer Pattern.

Aby to wykonać, spójrz na this answer.

+3

Jak mówi "nie korzystaj z problemu obserwatora" pomóż OP w najmniejszym stopniu (pod względem odpowiedzi na jego pytanie)? –

+1

Zgaduję, że "nie rób tak w ogóle, rób to w jakiś pokrewny sposób", co oznacza senia. – Jesper

+0

@KirkWoll: OP przegłosował odpowiedź, musi zrobić coś dobrze =) – FMM

2

This is a nice article how to implement C# events in Scala Pomyśl, może to być naprawdę pomocne.

Podstawowa klasa zdarzenia;

class Event[T]() { 

    private var invocationList : List[T => Unit] = Nil 

    def apply(args : T) { 
    for (val invoker <- invocationList) { 
     invoker(args) 
    } 
    } 

    def +=(invoker : T => Unit) { 
    invocationList = invoker :: invocationList 
    } 

    def -=(invoker : T => Unit) { 
    invocationList = invocationList filter ((x : T => Unit) => (x != invoker)) 
    } 

} 

i wykorzystanie;

val myEvent = new Event[Int]() 

val functionValue = ((x : Int) => println("Function value called with " + x)) 
myEvent += functionValue 
myEvent(4) 
myEvent -= functionValue 
myEvent(5) 
+0

Od pytania: "Nie szukam implementacji zdarzeń C# w Scali." – FMM

+2

Proszę, jeśli zamieścisz link, podaj co najmniej podstawowy fragment: w miarę upływu czasu strona może stać się niedostępna, a przyszły czytelnik nie będzie miał żadnego kierunku, aby się w nią zagłębić. –

Powiązane problemy