2013-07-25 24 views
0

我有一些自定义属性,这个类是许多其他clases 基类的基类这是我的课:需要运行一个受保护的方法时,我的类实例化

[CustomAttribute1("First")] 
[CustomAttribute2("Other")] 
public class Foo 
{ 
    protected void checkAttributes() 
    { 
     // Need to run this code when the class and derived classes are instantiated 
    } 
} 

然后,如果我创建一个实例

Foo MyClass = new Foo(); 

或建立一个dereived类:

[CustomAttribute1("FirstDerived")] 
public CustClass : Foo 
{ 
    public CustClass(int MyVar) 
    { 
     //Something here 
    } 
    public void OtherMethod() 
    { 
    } 
} 

CustClass MyClass = new CustClass(5); 

我需要个e方法checkAttributes() allways运行。

这是可能吗?

还有另一个aproach?

注:我需要舒尔checkAttributes()运行,即使在派生类的构造函数被重新定义:

回答

5

是的,只是定义调用此方法构造:

public class Foo 
{ 
    public Foo() 
    { 
     checkAttributes(); 
    } 

    protected void checkAttributes() 
    { 
     throw new NotImplementedException(); 
    } 
} 

由于只要Foo上的每个构造函数都会调用checkAttributes()(直接或链接到构造函数),派生类将无法避免检查。

(虽然目前还不清楚为什么这个方法会受到保护,但考虑使它成为私有的,因为它听起来像是一个对象构建时的一次性检查运行,并且不需要稍后运行。)


一个Foo的构造必须由任何类型的,从Foo(直接或间接)导出被调用(直接或间接)。

从C#5语言规范的第10.11.1:

所有实例构造(除了那些用于object类)隐式地包括另一个实例构造的紧接构造体之前调用。

...

如果一个实例构造函数没有构造函数初始化,形式base()的构造函数初始化时隐式地提供。

方式派生类型可避免调用Foo构造将是无限递归到其自身的构造,这将最终导致StackOverflowException之一。

+0

但如果在派生类中有一个像美孚(INT MYVAR)另一个构造什么发生? –

+1

@JuanPabloGomez任何类型的**构造函数**必须**只调用一个其他构造函数('System.Object'是唯一的异常),无论是在相同类型还是在父类型上。如果省略链式构造函数调用,则使用父级无参数构造函数。 (如果父类型不包含无参数构造函数,并且在派生类型的构造函数中未明确指定链接构造函数,则这是编译时错误。)[请参见演示。](http://ideone.com/ OgXXeA) – cdhowie

+0

这意味着空的构造函数总是在我的类型和派生类型上运行?我的问题是派生类,他们可以实现它拥有构造函数。 –

0

如果你想运行它的每个对象创建的对象,你将不得不调用它在一个正常的构造函数。

public Foo() 
    { 
    //Your normal method call 
    } 

但是如果你想你的应用程序生命周期内只运行一次,你可以在静态构造函数调用,比如

static Foo() 
{ 
    // your static method that needs to be run only once 
} 
+0

需要很多。但我需要为每个对象运行。 –

相关问题