4

我有以下类结构:

public abstract class PresenterBase
{
    public static Dictionary<string, MethodInfo> methodsList;

    public void Bind()
    public void Initialize();
}


public class DevicePresenter: PresenterBase
{
   public void ShowScreen();
   public void HandleEvents();    
}

public class HomePresenter: PresenterBase
{
   public void ShowScreen();
   public void HandleEvents();
}

我想让 HomePresenter 和 DevicePresenter 拥有在 PresenterBase 中定义的 methodsList 静态成员的单独副本。

不幸的是,它们与上述实现共享相同的副本。

他们是替代方法吗,我可以为 HomePresenter 和 DevicePresenter 拥有单独的 methodsList 副本?我不愿意在派生类中定义方法列表,因为将来如果有人添加另一个派生类,他将不得不记住将方法列表添加到该类。

4

3 回答 3

6

根本不要让它成为静态的。那不行吗?

static与类型相关联的手段;non-static表示与实例相关联。

我手边没有 Visual Studio 实例,但我相信您也可以abstract在基类中标记该字段;然后编译器将要求您将其添加到任何派生类中。你绝对可以用一个属性来做到这一点。

另一方面,鉴于上面的代码,我可能会添加抽象方法ShowScreen()HandleEvents().PresenterBase

于 2011-03-17T09:22:46.970 回答
3

要直接回答这个问题,您可以将基类设为通用,这将为您提供单独的静态字典,这是否是一个好的设计是另一个问题。

public abstract class PresenterBase<T> where T : PresenterBase<T>
{
    public static Dictionary<string, MethodInfo> methodsList = 
         new Dictionary<string,MethodInfo>();

}

public class DevicePresenter : PresenterBase<DevicePresenter>
{

}

public class HomePresenter : PresenterBase<HomePresenter>
{

} 
于 2011-03-17T10:26:19.263 回答
1

我不会让它成为静态的,因为您希望每个实例都有自己的列表,将 methodsList 定义为 PresenterBase 的属性并在 PresenterBase 中定义一个构造函数,该构造函数接受Dictionary<string, MethodInfo>并将属性设置为该值

这样,您可以确保任何派生类都必须提供此功能,但每个实例都有自己的列表。

我还将定义抽象方法ShowScreen(),并HandleEvents()按照PresenterBase@Michael Kjorling 的建议

于 2011-03-17T09:28:49.743 回答