首页 > 解决方案 > 如何沿侧基类实现受约束的泛型

问题描述

假设我有一个实现的基类INotifyPropertyChanged

    internal class BaseClass: INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        internal void OnPropertyChanged(string property)
        {
            // Logic...
        }
    }

自然,任何继承基类的类都可以OnPropertyChanged毫无问题地使用该方法。

当我开始使用受约束的泛型时,我的问题就开始了。当我将泛型约束到任何指定的接口时,派生类就不能再使用该OnPropertyChanged方法。

    internal class DerivedClass<T> where T: BaseClass, IComparable
    {
        private void DoSomething()
        {
            // Logic...
            OnPropertyChanged("FooBar"); // The name 'OnPropertyChanged' does not exist in the current context
        }
    }

我想知道什么样的实现可以让我将泛型约束到一个接口而不限制基类的使用。但是,如果不可能,那么有什么线索可以解释为什么吗?

标签: c#generics

解决方案


您不是从 BaseClass 派生的,因此您当然不能访问类方法。您需要在用于实例化 DerivedClass 的类型 T 的实例上调用该方法,如下所示:

public class DerivedClass<T> where T: BaseClass, IComparable
{ 
   T _t;

    public DerivedClass(T t)
    {
      _t = t;
    }
    private void DoSomething()
    {
        // Logic...
        _t.OnPropertyChanged("FooBar"); 
    }
  }

也许你真正在寻找的是这样的:

public class DerivedClass<T> : BaseClass where T: IComparable

这将做你想要的,同时仍然限制类型。


推荐阅读