我有些事情一直困扰着我。你看,我发现自己在游戏的各个类中一遍又一遍地编写完全相同的私有函数。从本质上讲,它只是一个构建类对象的方法;它是一种初始化方法。这是一个简短的例子:
public class MyClass {
public MyClass() {
Initialize();
}
private void Initialize() {
// do kung fu
}
}
如您所见,私有方法在构造函数中调用。我想我可能在我目前的项目中做了至少二十次这样的事情。现在我想要一个简单的方法来实现它 - 通过visual studio / resharpers refractoring - 很容易。
使用visual studio和界面时,您需要订阅所有界面方法。我喜欢这个; visual studio自动帮我做,我喜欢基于订阅的界面使用。
唯一真正的问题是接口不能拥有私有方法。所以,我想我的问题是:什么是有助于促进私有(和必需)方法的下一个最好的事情,同时像界面一样?我还应该提一下,继承是不可能的,因为大多数类都没有功能上的相关性。
答案 0 :(得分:3)
首先,我认为你应该在构造函数中编写对象构造代码,而不是在你调用的单独方法中。
其次,你的方法被破坏了:你可以强制一个类来实现一个方法,但你不能强制它被调用。因为在构造函数内部调用方法是危险的(由于半初始化的实例),所以在对派生类使用virtual
方法时。我认为你应该完全避免使用它。
没有像私人界面那样的东西。接口旨在告诉外界这种类型的一些特征,而不是类的内部。除此之外,你不能强制调用方法,所以这种方法是错误的。
你必须强制执行此操作的唯一(工作)可能是创建一个抽象的基类,使用抽象的Intitialize
方法,但我怀疑这是否是要走的路(我不建议这样做)
这样的事情:
public abstract class BaseClass
{
public BaseClass()
{
this.Initialize();
}
protected abstract void Initialize();
}
答案 1 :(得分:3)
通过巧妙使用类型系统无法实现您的目标。
(如果继承不是不可能的,您可以创建一个abstract
基类,其中protected abstract Initialize()
方法和protected
构造函数调用前一个方法。)
如果您正在使用Visual Studio,我建议您创建一个IDE代码段:
class <ClassName>
{
public <ClassName>
{
Initialize();
}
private void Initialize()
{
// do kung fu
}
}
然后,您可以为其指定一个短信组合,例如cwinit
,无论何时键入 c w i n i t Tab ,为您插入了该代码段,您可以覆盖<ClassName>
占位符。
您可以创建这样的代码段,例如使用Snippet Designer extension。
答案 2 :(得分:0)
我认为抽象类在这里是一个坏主意,至少是因为它可以仅从其他类继承而不再继承。怎么样:
创建并实现公共接口,但不使用它;无法创建接口类型的实例;
使用某种类接受您的类实例作为ref参数的辅助类;
类SettingsInit { static YourClassName SetValue(ref YourClassName instance) { ......你的逻辑在这里 } }