gpt4 book ai didi

C# 在 switch 语句中定义子类

转载 作者:太空宇宙 更新时间:2023-11-03 18:03:03 26 4
gpt4 key购买 nike

我正在尝试根据输入创建子类的新实例。为此,我使用了 switch 语句。

[HttpPost]
public ActionResult Register(RegisterViewModel model)
{
var user = new User();

switch (model.UserType)
{
case UserType.Normal:
user = (NormalUser) user;
// NormalUser properties cannot be defined here
break;
case UserType.Vip:
user = (VipUser) user;
// VipUser properties cannot be defined here
break;
}
}

寻找解决该问题的最佳解决方案。

最佳答案

当使用 new User() 时,您正在创建此类的一个新实例,该实例不知道其任何子类。因此,对其中任何一个的转换都会失败。

问题是程序无法知道在执行转换时如何设置在 NormalUser 中定义但不在基类中的成员。因此,假设您的基类有成员 Name 和 Àdress,而您的NormalUser除了这两个属性之外还有一个Age属性。当您将现有的用户转换为NormalUser时,您期望Age是什么。你的程序不知道如何设置Age`。

您必须为此创建一个复制构造函数才能工作,或者根本不在切换之前实例化变量:

User user;

switch (model.UserType)
{
case UserType.Normal:
user = new NormalUser();
break;
case UserType.Vip:
user = new VipUser()
break;
}

这遵循工厂模式,因此此方法的用户可以使用它来创建给定类型的实例,而无需依赖该类型,从而减少客户端代码与工厂中创建的实际类型的耦合。

您还需要一些 default-switch 来让编译器知道如果您的条件都没有通过该怎么做 - 即使这在您的场景中是不可能的。例如,您可能会在这种情况下抛出异常。

复制构造函数的选项在这里:

class NormalUser
{
public NormalUser(User user, int age)
{
this.Name = user.name;
this.Adress = user.Adress;
// further properties defined in the base-class

this.Age = age
// further properties defined in NormalUser
}
}

如您所见,这是对属性的大量复制。特别是第一个选项更适合您的 sneario。

关于C# 在 switch 语句中定义子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44064989/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com