2014-01-08 20 views
1

我真的不知道我怎麼字要什麼,所以我就顯示,無法正常工作代碼:多態性泛型(或類似的東西)

abstract class EventListener<T> where T : IEvent 
{ 
} 

interface IEvent 
{ 
} 

/* 
* Simplified a bit, normally this class would use a dictionary of event listeners 
*/ 
class Manager 
{ 
    private EventListener<IEvent> listener; 

    public void RegisterListener<T>(EventListener<T> subject) where T : IEvent 
    { 
     // here is the issue 
     listener = subject; 
    } 
} 

/* 
* Implementation 
*/ 

class FooEvent : IEvent 
{ 
} 

class FooListener : EventListener<FooEvent> 
{ 
} 

當我嘗試時出現問題將subject分配給listener。我試圖在分配前投射,但有類似的問題:

EventListener<IEvent> casted = subject as EventListener<IEvent>; 
events.Add(typeof(T), casted); 

有沒有辦法使這項工作?

+0

你可以在你的文章中添加'EventListener '和'Event'的成員嗎?另外,請爲接口名稱添加前綴(「IEvent」而不是「Event」)。 – Dennis

+0

@丹尼斯我已經確定了名字,但我認爲現在不需要添加成員,因爲問題已經解決。我試圖儘可能簡化這篇文章。 –

回答

1
  1. 添加非通用接口IEventListener

    interface IEventListener 
    { } 
    
  2. EventListener<T>類實現它:

    abstract class EventListener<T> : IEventListener where T : IEvent 
    { 
    } 
    
  3. 更改Manager.listener域類型爲IEventListener

    private IEventListener listener; 
    
+0

謝謝,我不認爲這會很簡單。 –