接口继承是否在这里做正确的事情,为什么它不起作用?

时间:2011-12-22 09:56:09

标签: c# inheritance interface

我正在实现一些类型(下例中的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!
        }
    }
}

2 个答案:

答案 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!
        }
    }
}

定义相同的方法并不意味着它是相同的类型。