我有以下课程结构:
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添加到该类中。
答案 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建议