同时调用基构造函数和无参数构造函数

本文关键字:构造函数 参数 调用 | 更新日期: 2023-09-27 18:30:33

这里有一件事让我印象深刻,我想知道这是否可能。

话短说 - 这是代码:

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吗?

同时调用基构造函数和无参数构造函数

简短的回答:不,你不能。

解决方法:

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

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

但是,您也应该不希望订阅自己的事件 - 这通常是一种代码气味。在这种情况下,最好检查一个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);
    }
}