C# 视图模型继承

C# 视图模型继承,c#,inheritance,viewmodel,C#,Inheritance,Viewmodel,我想根据所选选项加载带有ViewModel的屏幕 我认为继承在这里是关键,因为很多属性都是相同的。下面是我的代码摘录 public partial class Form1 : Form { public Form1() { InitializeComponent(); bool isHandheld = false; var pdv1 = isHandheld == true ? new PDVHH() : new PDV();

我想根据所选选项加载带有ViewModel的屏幕

我认为继承在这里是关键,因为很多属性都是相同的。下面是我的代码摘录

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        bool isHandheld = false;

        var pdv1 = isHandheld == true ? new PDVHH() : new PDV();

        txtCaseID.Text = pdv1.CaseID;
        txtPDV.Text = isHandheld == true ? pdv1.PDVString : string.Empty;
        txtPDVHH.Text = isHandheld == true ? pdv1.PDVHHString : string.Empty;

    }
}

class basePDV
{
    public string CaseID { get; set; }
}

class PDV : basePDV
{
    public string PDVString { get; set; }
}

class PDVHH : basePDV
{
    public string PDVHHString { get; set; }
}
我收到的错误是。。。“无法确定条件表达式的类型,因为'WindowsFormsApplication1.PDVHH'和'WindowsFormsApplication1.PDV'之间没有隐式转换”


我希望有人能给我一些关于这个问题的解决方案的指导。

好的,你的问题不是关于继承或视图模型,而是关于
?:
(条件运算符)是如何工作的

以下内容将修复此问题:

var pdv1 = isHandheld == true ? (basePDV) new PDVHH() : (basePDV) new PDV();
虽然您的代码看起来似乎有道理,但文档说您需要在PDVHH和PDV之间进行转换,无论是哪种方向,但没有考虑到到到basePDV的转换

当您可以找到PDVString和PDVHHString的通用名称并将其作为基类中的单个属性实现时,它可能会按照您的需要工作。甚至更简单。请注意,
classpdv:basePDV{}
是可以的。

C语言规范区分了三种类型的语句。通常,您可以使用以下语句:

标记语句-这是用于go to语句

声明语句-用于变量声明

嵌入式语句-适用于所有剩余语句

在if语句中,主体必须是嵌入式语句,这解释了为什么第一个版本的代码不能工作

if(布尔表达式)嵌入语句 if(布尔表达式)嵌入语句else嵌入语句

变量声明是声明语句,因此它不能出现在主体中。如果将声明括在括号中,将得到一个语句块,它是一个嵌入式语句(因此它可以出现在该位置)


PDVHH和PDV是两个不同的对象,即使它们继承自同一个类。基本原则。仅供参考,您的
pdv1
将属于
PDV
类型。只是有时候will也是
PDVHH
类型,所以很有可能将对象向下转换到
PDVHH
会失败,并且您将无法访问(不存在的)属性
pdvhString
@HenkHolterman I-knowledge?:如何工作,我试图用它来解决我的问题。如果有其他方法,请帮助我。就我个人而言,我会选择作文而不是继承。。。这并不能解决我的问题,因为当尝试使用PDVHH或PDV中的任何一个属性时,Visual Studio都无法看到它们。我猜这是因为我正在将它转换为basePDV。这是您的解决方案中的基本缺陷<代码> var 不像看上去那样灵活。你能给我指出使用不同视图模型的同一屏幕的正确方向吗?“与不同的视图模型相同的屏幕”不是我会考虑的。虽然相反(一个视图模型有多个视图)是很常见的,但您的示例过于简化,无法给出很好的建议。但是问问自己,为什么手持设备需要不同的ViewModel?逻辑有什么不同吗?对于绑定到同一抽象视图模型的不同设备,我们通常有不同的视图(标记),您不能在它们所在的
{}
之外使用
pdv1
s。不是一个解决方案,仍然是一个可能的解决方案。他只需在if分支中执行分配,在该分支中检查它是否为手持设备。阅读此处的其余注释,核心问题在其他地方。验证问题是否与模型有关。
var pdv1 = isHandheld == true ? new PDVHH() : new PDV(); is considered a declaration-statement.

//var pdv1 = isHandheld == true ? new PDVHH() : new PDV(); won't work but the following will

// The above is the equivalent of the below statement which will NOT work.
if (isHandheld)
      var pdv1 = new PDVHH();
else
      var pdv1 = new PDV();

if (isHandheld)
{
    var pdv1 = new PDVHH();
}
else
{
    var pdv1 = new PDV();
}