【发布时间】:2019-12-06 07:57:44
【问题描述】:
我正在尝试在 F# 中实现以下类(来自 https://peteohanlon.wordpress.com/2008/10/22/bulk-loading-in-observablecollection/):
public class RangeObservableCollection<T> : ObservableCollection<T>
{
private bool _suppressNotification = false;
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
if (!_suppressNotification)
base.OnCollectionChanged(e);
}
public void AddRange(IEnumerable<T> list)
{
if (list == null)
throw new ArgumentNullException("list");
_suppressNotification = true;
foreach (T item in list)
{
Add(item);
}
_suppressNotification = false;
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
}
这是简单的代码,移植也很直接:
type RangeObservableCollection<'T>() =
inherit ObservableCollection<'T>()
let mutable suppressNotification = false
override __.OnCollectionChanged(e: NotifyCollectionChangedEventArgs) =
if not suppressNotification
then base.OnCollectionChanged e
member __.AddRange(items: 'T seq) =
if isNull items
then ArgumentNullException "items" |> raise
suppressNotification <- true
items |> Seq.iter __.Add
suppressNotification <- false
NotifyCollectionChangedAction.Reset
|> NotifyCollectionChangedEventArgs
|> __.OnCollectionChanged
但是,我在最后一行收到编译器错误,说
调用了受保护的成员或正在使用“base”。这仅在成员的直接实现中允许,因为它们可以逃脱其对象范围。
我能找到的对该错误的唯一其他参考是this question;但是,那里的解决方案似乎不适用于这里,因为我不处理事件。
所以,我的问题分为两部分:
- 就语言/编译器而言,这里的实际问题是什么?
- 有没有办法解决这个问题,还是无法在 F# 中实现?
【问题讨论】:
标签: inheritance f# protected