2011-10-31 99 views
0

我试图做一个类酒吧,它扩展了一个类FooFoo的代码超出了我的控制范围。重定向没有参数的构造函数到参数为基类的ctor

当有人酒吧的新实例(通过写类似酒吧X =新的酒吧();)我想这触发对构造函数的输入参数的调用。

基本上是:

class Foo { 
    public Foo(string message) { print("The new Foo says: " + message); } 
} 

class Bar : Foo { 
    public Bar() : base(this.GetType()) { } 
} 

所以,当有人使用新的酒吧(),它应该打印出来新富说:酒吧。 (假设有一个print函数,这不是重点。)

相反,C#抱怨,因为我试图计算基础构造函数的参数结果。

请记住,Foo是我无法达到的,所以我不能更改任何代码在Foo

+1

邮政确切的错误信息。这段代码看起来正确。 –

+1

Foo的确切ctor是什么? Foo(char [])也许? –

+1

@HenkHolterman,你是对的,我只是编辑了这个问题,因为我意识到这实际上是一个稍微不同的问题。 – Joe

回答

3

你不能在一个类的构造函数中实际使用前this,因为只有参数和静态成员(为static构造函数之前,任何非静态的运行),在这种情况下accessable。在您能够访问this之前,运行时首先需要构建您继承的任何类。

作为一种变通方法,您可以使用typeof操作:

class Bar : Foo { 
    public Bar() : base(typeof(Bar).ToString()) { } 
} 

当然,这是不可移植的,但可能是你将能够拿出的最好的事情。

+0

似乎要纠正。 –

+0

他在问题中编辑了它。 – Femaref

+0

对不起,我的第一个问题在这里。 – Joe

1

this.GetType()将不能用作初始化例程。

您不能执行传递给基类但依赖于当前实例的代码。这是合乎逻辑的,因为基类构造函数首先执行

但是,如果您传递类型,则可以使用typeof而不是GetType()

以下代码运行并正确编译:

namespace TestNamespace 
{ 
    using System; 

    public class Test 
    { 
     public static void Main() 
     { 
      var foo = new Bar(); 
      Console.ReadKey(); 
     } 
    } 

    class Foo 
    { 
     public Foo(Type type) { Console.WriteLine("The type of Foo is: " + type.ToString()); } 
    } 

    class Bar : Foo 
    { 
     public Bar() : base(typeof(Bar)) { } 
    } 
} 

在执行时,这个打印到控制台:

的Foo类型的是:TestNamespace.Bar

相关问题