在每个派生类中具有基类静态成员的单独副本

时间:2011-03-17 09:17:00

标签: c# .net static-classes

我有以下课程结构:

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副本吗? 我不愿意在派生类中定义methodsList,因为将来如果有人添加了另一个派生类,他必须记住将methodsList添加到该类中。

3 个答案:

答案 0 :(得分:6)

根本不要让它静止。那不行吗?

static表示与该类型相关联;非 - static表示与实例关联。

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

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

答案 1 :(得分: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>
{

} 

答案 2 :(得分:1)

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

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

我还要将ShowScreen()HandleEvents()定义为PresenterBase,因为@Michael Kjorling建议