Adapter class 或 IComparer、IComparer<T> 的多个接口实现
Adapter class or multiple interface implementations for IComparer, IComparer<T>
我需要在 WPF DataGrid 的 ListCollectionView 上使用自定义排序算法。
我创建了 IComparer<string>
的实现,因为我使用字符串,但是 ListCollectionView
的 CustomSort
属性 只采用非通用 IComparer
实现:
listCollectionView.CustomSort = new MyComparer(); // this wont work
因为我的比较逻辑是专门针对字符串的,而我需要一个 IComparer
实例,所以我正在考虑像这样创建一个 MyComparerAdapter
适配器:
public class MyComparerAdapter : IComparer
{
private readonly IComparer<string> _innerComparer = new MyComparer();
public int Compare(object a, object b)
{
return _innerComparer.Compare((string)a, (string)b);
}
}
但我还不如在 MyComparer
class 中实现非通用 IComparer 接口,这将调用通用 Compare 方法。
哪种解决方案更可取,为什么?适配器会是一个无用的额外组件吗?同时实现 IComparer 的泛型和非泛型方法有缺点吗?
我发现少即是多。实现最低限度并仅在需要时添加。
翻译成你的情况,这取决于...
您是否看到自己在任何地方(在您的视图模型中)使用通用变体?
没有
CollectionView 本质上是基于对象的。仅实施 IComparer 就足够了。
是
在 MyComparer
上实施两者。我只在需要进行一些预处理或后处理时才使用 Adapter / Decorator 模式。
我需要在 WPF DataGrid 的 ListCollectionView 上使用自定义排序算法。
我创建了 IComparer<string>
的实现,因为我使用字符串,但是 ListCollectionView
的 CustomSort
属性 只采用非通用 IComparer
实现:
listCollectionView.CustomSort = new MyComparer(); // this wont work
因为我的比较逻辑是专门针对字符串的,而我需要一个 IComparer
实例,所以我正在考虑像这样创建一个 MyComparerAdapter
适配器:
public class MyComparerAdapter : IComparer
{
private readonly IComparer<string> _innerComparer = new MyComparer();
public int Compare(object a, object b)
{
return _innerComparer.Compare((string)a, (string)b);
}
}
但我还不如在 MyComparer
class 中实现非通用 IComparer 接口,这将调用通用 Compare 方法。
哪种解决方案更可取,为什么?适配器会是一个无用的额外组件吗?同时实现 IComparer 的泛型和非泛型方法有缺点吗?
我发现少即是多。实现最低限度并仅在需要时添加。
翻译成你的情况,这取决于...
您是否看到自己在任何地方(在您的视图模型中)使用通用变体?
没有
CollectionView 本质上是基于对象的。仅实施 IComparer 就足够了。
是
在 MyComparer
上实施两者。我只在需要进行一些预处理或后处理时才使用 Adapter / Decorator 模式。