提问者:小点点

派生类到基类的显式强制转换


我试图将一个派生类对象强制转换为它的基类(通过JSON转换保存它)。每当我尝试从派生类对象获取基类时,它都会返回派生类的一个对象。我无法获得基类对象(尝试使用显式和隐式强制转换以及转换)。

public class PlanningListModel : INotifyPropertyChanged
{
    private DateTime _date;
    private List<PlanningEntryModel> _Plannings;
    private bool _isSaving = false;

    public List<PlanningEntryModel> Plannings {get=>_Plannings;} //field i want to serialize
    //Same declarations for public fields
}

public class PlanningListViewModel :PlanningListModel   INotifyPropertyChanged
{
    private DateTime _date;
    private List<PlanningEntryModel> _Plannings;
    private bool _isSaving = false;

    public List<PlanningEntryModel> Plannings{           
        get {
            if (App.Data == null || App.Data.User == null || App.Data.IsReplicating)
                return base.Plannings.FindAll(x => true);
            switch (App.Data.CurrentList) {
                case 0: return base.Plannings.FindAll(x => true);
                case 1: return base.Plannings.FindAll(x => x.Volonter.ID == App.Data.User.ID);
                case 2: return base.Plannings.FindAll(x =>  x.User.Referent==App.Data.User.ID);
                default: return base.Plannings.FindAll(x => true);
        }
    }
} 

我要做的是:

PlanningListViewModel A = new PlanningListViewModel ();
PlanningListModel B = (PlanningListModel)A;
typeof(B); // B stays PlanningListViewModel and not PlanningListModel

我需要访问基类的字段(因为派生类的字段被修改(被重写的对象,我无法强制转换为它的基类。

我做错了什么?我非常感谢任何帮助!


共1个答案

匿名用户

我需要访问基类的字段Plannings(因为派生类的Plannings字段被修改(重写的get))。

在你的情况下,它不起作用,因为财产不是虚拟的。你必须这样声明:

public class PlanningListModel : INotifyPropertyChanged
{
    …
    public virtual List<PlanningEntryModel> Plannings {get=>_Plannings;}
}

然后重写如下所示:

public class PlanningListViewModel : PlanningListModel
{
    …
    public override List<PlanningEntryModel> Plannings { … }
}

那么对的调用将按照您的预期工作,即调用类中声明的getter。

每当我尝试强制转换时,对象保持PlanningListViewModel对象,我无法强制转换为它的基类。

是的,那是故意的。下面两行是等价的:

PlanningListModel B = (PlanningListModel)A;
PlanningListModel B = A;

你看,甚至不需要显式转换。强制转换不会更改对象的类型(为了完整性起见:在相当罕见的自定义重载转换运算符场景中,这是不正确的)。它只影响你如何看待那个对象,即你看到了什么。