基类的抽象集合

时间:2013-08-09 08:50:28

标签: c# inheritance abstract-class

我正在使用MVVM框架创建WPF应用程序。

我有几个类都继承自基类" MessageParentBase"

public class ChatMessage : MessageParentBase
{
}

public class CargoMessage : MessageParentBase
{
}

ViewModels都从基类" ParentMessageWindowBaseViewModel"

再次继承
public class UserControlChatViewModel : ParentMessageWindowBaseViewModel
{
}

public class UserControlCargoViewModel : ParentMessageWindowBaseViewModel
{
}

现在我要做的是在我的" ParentMessageWindowBaseViewModel"中有一个可观察的集合。类

abstract internal ObservableCollection<MessageParentBase> GridData
{
    get; set;
}

这是什么,所以我可以在&#34; ParentMessageWindowBaseViewModel&#34; level,但是在子类中我希望声明一个更具体的集合

internal override ObservableCollection<ChatMessage > GridData
{
    get { return _GridData; }
    set
    {
        _GridData = value;
    }
}

Visual Studio告诉我必须将其声明为&#34; MessageParentBase&#34;。

有人可以向我解释我是如何实现这一点的,因为我现在正在挣扎。

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:2)

ObservableCollection&lt; ChatMessage&gt; ObservableCollection&lt;不同MessageParentBase&gt; 因此您无法覆盖它。

您可以这样使用:

public class MessageParentBase
{
}

public class ChatMessage : MessageParentBase
{
}

public abstract class ParentMessageWindowBaseViewModel<T> where T : MessageParentBase
{
    abstract internal ObservableCollection<T> GridData
    {
        get;
        set;
    }
}

public class Child : ParentMessageWindowBaseViewModel<ChatMessage>
{

    internal override ObservableCollection<ChatMessage> GridData
    {
        get;
        set;
    }
}

但是不能将所有Childs存储在1个列表中。所以它不会解决继承在泛型属性上的问题。

答案 1 :(得分:0)

在您声明属性 GridData abstract 的类中,为什么还要引入支持字段< / em> _GridData那里?不要那样做。

如果您希望该属性为abstract,请不要在其中添加任何支持字段。如果要在“高”级别(基类)实现该属性,请从中删除abstract修饰符。