调用基础构造函数和无参数构造函数?

时间:2013-09-06 08:41:52

标签: c# inheritance constructor

这让我感到震惊,我想知道这是否可能。

长话短说 - 这是代码:

public class NotificationCollection : ObservableCollection<Notification>
{
    public NotificationCollection() : base()
    {
        this.CollectionChanged += NotificationCollection_CollectionChanged;
        this.PropertyChanged += NotificationCollection_PropertyChanged;
    }

    public NotificationCollection(IEnumerable<Notification> items)
        : base(items)
    {
        this.CollectionChanged += NotificationCollection_CollectionChanged;
        this.PropertyChanged += NotificationCollection_PropertyChanged;
    }
(....)
}

正如您所看到的,我正在复制代码。如果我没有创建一个继承的类,我会写

public NotificationCollection(IEnumerable<Notification> items)
    : this() //I can just call the empty constructor
{
    //do stuff here...
    //however, in case of inheritance this would be handled by base(items)
}

所以,我的问题是 - 我可以同时调用base类构造函数和this构造函数吗?

2 个答案:

答案 0 :(得分:8)

简答:不,你不能。

解决方法:

public NotificationCollection() : this(Enumerable.Empty<Notification>())
{
}

public NotificationCollection(IEnumerable<Notification> items)
    : base(items)
{
    this.CollectionChanged += NotificationCollection_CollectionChanged;
    this.PropertyChanged += NotificationCollection_PropertyChanged;
}

答案 1 :(得分:6)

您只能链接到一个构造函数 - 在当前类型(this(...))或基本类型(base(...))中。如果你需要在这两种情况下调用不同的基础构造函数,那么不 - 你不能共享this()代码。您可以将该代码移动到单独的方法中,并从两个地方调用它(假设不涉及readonly成员)。

但是,您还应该更喜欢 not 订阅您自己的活动 - 这通常是代码味道。在这种情况下,最好检查override

public class NotificationCollection : ObservableCollection<Notification>
{
    public NotificationCollection() : base() {}

    public NotificationCollection(IEnumerable<Notification> items)
        : base(items) {}

    protected override void OnCollectionChanged(
        NotifyCollectionChangedEventArgs e)
    {
        // YOUR CODE HERE
        base.OnCollectionChanged(e);
    }
    protected override void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        // YOUR CODE HERE
        base.OnPropertyChanged(e);
    }
}