我正在实现一些类型(下例中的MyType
),它具有Collection
属性。在MyType
里面我真的不在乎这是什么样的收藏。我唯一关心的是它实现了IEnumerable<String>
和INotifyCollectionChanged
。如何使用这些限制实现Collection
属性?
这是我尝试过的:
我创建了一个新界面:
interface INotifyEnumerableCollectionChanged<T> : IEnumerable<T>, INotifyCollectionChanged {}
并在Collection
类型的MyType
中创建了INotifyEnumerableCollectionChanged<String>
属性。这似乎适用于MyType
。看起来我可以枚举该集合并注册CollectionChanged
事件。
但是我无法将此属性设置为集合(在下面的示例中为MyCollection
),即使很难MyCollection
同时实现IEnumerable<String>
和INotifyCollectionChanged
。
编译器说:
无法隐式转换类型 'InterfaceInheranceTest.Program.MyCollection'来 'InterfaceInheranceTest.Program.INotifyEnumerableCollectionChanged'。 存在显式转换(你错过了吗? 投?)
这样做的正确方法是什么?
以下是完整的示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.Specialized;
namespace InterfaceInheranceTest
{
class Program
{
interface INotifyEnumerableCollectionChanged<T> : IEnumerable<T>, INotifyCollectionChanged {}
class MyCollection : IEnumerable<String>, INotifyCollectionChanged
{
IEnumerator<String> IEnumerable<String>.GetEnumerator()
{ throw new NotImplementedException(); }
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{ throw new NotImplementedException(); }
public event NotifyCollectionChangedEventHandler CollectionChanged;
}
class MyType
{
private INotifyEnumerableCollectionChanged<String> _Collection;
public INotifyEnumerableCollectionChanged<String> Collection
{
get { return _Collection; }
set
{
_Collection = value;
_Collection.CollectionChanged += new NotifyCollectionChangedEventHandler(_Collection_CollectionChanged);
foreach (var item in _Collection)
{
Console.WriteLine(item);
}
}
}
void _Collection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{ throw new NotImplementedException(); }
}
static void Main(string[] args)
{
var collection = new MyCollection();
var type = new MyType();
type.Collection = collection; // compiler doesn't like this!
}
}
}
答案 0 :(得分:3)
您的课程需要实施INotifyEnumerableCollectionChanged<T>
。
class MyCollection : INotifyEnumerableCollectionChanged<string>.
IEnumerable<string>, INotifyCollectionChanged
{
IEnumerator<String> IEnumerable<String>.GetEnumerator()
{ throw new NotImplementedException(); }
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{ throw new NotImplementedException(); }
public event NotifyCollectionChangedEventHandler CollectionChanged;
}
这是必需的,因为您使用的变量(_collection
)的类型为INotifyEnumerableCollectionChanged<T>
。但是,您的类 - MyCollectionChanged
未实现此接口,因此无法将其指定为对变量的引用。
答案 1 :(得分:1)
您创建了一个新界面但不使用它。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.Specialized;
namespace InterfaceInheranceTest
{
class Program
{
interface INotifyEnumerableCollectionChanged<T> : IEnumerable<T>, INotifyCollectionChanged {}
class MyCollection : INotifyEnumerableCollectionChanged<String> // Use your interface
{
IEnumerator<String> IEnumerable<String>.GetEnumerator()
{ throw new NotImplementedException(); }
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{ throw new NotImplementedException(); }
public event NotifyCollectionChangedEventHandler CollectionChanged;
}
class MyType
{
private INotifyEnumerableCollectionChanged<String> _Collection;
public INotifyEnumerableCollectionChanged<String> Collection
{
get { return _Collection; }
set
{
_Collection = value;
_Collection.CollectionChanged += new NotifyCollectionChangedEventHandler(_Collection_CollectionChanged);
foreach (var item in _Collection)
{
Console.WriteLine(item);
}
}
}
void _Collection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{ throw new NotImplementedException(); }
}
static void Main(string[] args)
{
var collection = new MyCollection();
var type = new MyType();
type.Collection = collection; // compiler doesn't like this!
}
}
}
定义相同的方法并不意味着它是相同的类型。