C#覆盖基类集合类型

3

我有一个基类

,它包含以下内容:
     public abstract class BaseClass
    {
     ICollection<int> Numbers {get;set;}
    }

有没有一种方法可以得到以下结果?
    public abstract class SubClass : BaseClass
    {
     override ObservableCollection<int> Numbers {get;set;}
    }

那么子类有一个ObservableCollection,或者我可以实现一个设计模式吗?

2
在覆盖时无法更改类型。考虑实现两个接口,一个带有ICollection,另一个更具体。使用这些代码的人必须去寻找他们想要交互的特定接口。但是,你需要吗?任何必须支持BaseClass的代码都必须支持ICollection<int> - Lasse V. Karlsen
2
公开一个“可设置”的集合属性往往会有问题。当有人执行 ((BaseClass)new SubClass()).Numbers = new SomeOtherCollectionType(); 时会发生什么?(即使在一般情况下,您通常希望保留对集合的所有权,并不让其他人随意更改它,但在这里情况尤其糟糕) - Damien_The_Unbeliever
我从未考虑过这一点,我只是想改变集合类型,因为我正在使用需要可观察集合且与数据模型相同类型的ViewModel。 - Jack
你可以这样写,但是考虑其他选项。new ObservableCollection<int> Numbers {get;set;} - Renatas M.
3个回答

6

泛型可以帮助您实现类似的行为:

public abstract class BaseClass<T> where T : ICollection<int>
{
    public T Numbers { get; set; }
}

public abstract class SubClass : BaseClass<ObservableCollection<int>>
{

}

0

你不能这样覆盖它。

一个解决方案可能是创建一个新的具有不同名称的属性,如下所示:

public abstract class SubClass : BaseClass
{
    public ObservableCollection<int> ObservableNumbers => (ObservableCollection<int>)Numbers;
}

或者按照以下方式:(如果您确实需要设置它)
public abstract class SubClass : BaseClass
{
    public ObservableCollection<int> ObservableNumbers
    {
        get { return (ObservableCollection<int>)Numbers; }
        set { Numbers = value; }
    }
}

不要忘记将Numbers属性设为public或internal!


0
您可以尝试像下面这样添加 "new" 关键字。
public abstract class BaseClass
    {
        public virtual ICollection<int> Numbers { get; set; }
    }

    public abstract class SubClass : BaseClass
    {
        public new ObservableCollection<int> Numbers { get; set; }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接