2011-02-26 70 views
6

说我有以下几点:构造结合链与底座构造函数调用

class Base { 
    public Base (int n) { } 
    public Base (Object1 n, Object2 m) { } 
} 

class Derived : Base { 

    string S; 

    public Derived (string s, int n) : base(n) { 
     S = s; 
    } 

    public Derived (string s, Object1 n, Object2 m) : base(n, m) { 
     S = s; // repeated 
    } 
} 

注意我是如何需要通过正规的参数n中的两个重载的获得,因此我必须重复N = n;线。

现在我知道这可以封装到一个单独的方法,但你仍然需要从两个重载相同的两个方法调用。那么,有没有更好的方法来做到这一点,或许可以使用thisbase

这是我可以有一个私人构造函数采取一个参数s和其他两个重载可以调用那一个......或者这可能就像拥有一个单独的私有方法一样吗?

+1

有什么问题打电话是从接受额外的构造函数中的其他构造函数重载参数? 'this(s,n)'而不是'base(n,m)' – 2011-02-26 12:25:56

+0

我修改了这个问题,使它更好地反映了我目前的情况。我改变了重载基构造函数的参数类型。 – 2011-02-26 12:29:42

+0

啊,非常好。我最初并没有将其作为答案发布,因为我认为我错过了一些明显的东西。结果确实如此。 – 2011-02-26 12:30:56

回答

5

没有为没有理想的解决方案。有一种方法,以避免重复在Derived构造方法的代码,但你必须重复m参数的默认值:

public Derived (string s, int n) : this(s, n, 0) {} 
+0

我修改了这个问题,以便它能更好地反映我目前的情况。我改变了重载基构造函数的参数类型。 – 2011-02-26 12:41:04

+0

@Andreas Grech:在这种情况下,你甚至不能按照我的建议去做。没有办法避免重复该代码。 – Guffa 2011-02-26 19:59:45

0

仅略有好转,但...

class Derived : Base 
{ 
    string S; 
    public Derived(string s, int n) : this(s,n,-1) 
    { 
    } 

    public Derived(string s, int n, int m) : base(n, m) 
    { 
     S = s; 
     // repeated  
    } 
} 
+0

啊不,不会削减它;此外,这看起来像一个非常丑陋的解决方法,更不用说-1这个事实可能是一个有效的值在3参数超载 – 2011-02-26 12:23:24