C# 同时调用基构造函数和无参数构造函数?
这件事让我震惊,我想知道这是否可能 长话短说——以下是代码:C# 同时调用基构造函数和无参数构造函数?,c#,inheritance,constructor,C#,Inheritance,Constructor,这件事让我震惊,我想知道这是否可能 长话短说——以下是代码: public class NotificationCollection : ObservableCollection<Notification> { public NotificationCollection() : base() { this.CollectionChanged += NotificationCollection_CollectionChanged; thi
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;
}
(....)
}
公共类NotificationCollection:ObservableCollection
{
public NotificationCollection():base()
{
this.CollectionChanged+=通知集合\u CollectionChanged;
this.PropertyChanged+=通知集合\u PropertyChanged;
}
公共通知集合(IEnumerable items)
:基本(项目)
{
this.CollectionChanged+=通知集合\u CollectionChanged;
this.PropertyChanged+=通知集合\u 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)
}
公共通知集合(IEnumerable items)
:this()//我可以调用空构造函数
{
//在这里做事。。。
//但是,在继承的情况下,这将由基(项)处理
}
所以,我的问题是-我可以同时调用
base
类构造函数和this
构造函数吗?简短回答:不,你不能
解决方法:
public NotificationCollection() : this(Enumerable.Empty<Notification>())
{
}
public NotificationCollection(IEnumerable<Notification> items)
: base(items)
{
this.CollectionChanged += NotificationCollection_CollectionChanged;
this.PropertyChanged += NotificationCollection_PropertyChanged;
}
public NotificationCollection():此(Enumerable.Empty())
{
}
公共通知集合(IEnumerable items)
:基本(项目)
{
this.CollectionChanged+=通知集合\u CollectionChanged;
this.PropertyChanged+=通知集合\u PropertyChanged;
}
您只能链接到一个构造函数-当前类型(this(…)
)或基类型(base(…)
)。如果您需要在这两种情况下调用不同的基构造函数,则不可以-您不能共享this()
code。不过,您可能可以将该代码移动到一个单独的方法中,并从两个位置调用它(假设不涉及readonly
成员)
然而,您也不应该订阅自己的事件——这通常是一种代码气味。在这种情况下,最好检查覆盖
:
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);
}
}
公共类NotificationCollection:ObservableCollection
{
public NotificationCollection():base(){}
公共通知集合(IEnumerable items)
:基本(项目){}
CollectionChanged上的受保护覆盖无效(
NotifyCollectionChangedEventArgs(e)
{
//你的代码在这里
基础。变更的集合(e);
}
受保护的重写无效OnPropertyChanged(PropertyChangedEventArgs e)
{
//你的代码在这里
根据改变的财产(e);
}
}
等等。。。你为什么订阅自己的活动?这应该是一个危险信号…但要回答你的问题,不,你不能从一个构造函数中委托给两个构造函数。订阅我自己的事件(对所有提到的人)的观点很好。诚然,这只是一个小项目中的一个小变化中的一件小事,所以我并没有太多关注_