如何重写方法返回类型

本文关键字:方法 返回类型 重写 何重写 | 更新日期: 2023-09-27 18:29:11

我有一个父类和许多子类:

public class ParentViewModel
{
  public int Id{set;get;}
  public string Name{set;get;}
  <..and another 10 properties..>
}
public class ChildViewModel_1:ParentViewModel
{
  public string Notes{set;get;}
}

现在我有了一个创建子类的方法:

 public static ChildViewModel_1 MakeChild_1()
 {
    var child= new ChildViewModel_1
    {
      Id = ...
      Name = ...
      ...And another parent properties...
      Note = ...
    }
    return child;
 }

他们有很多具有父类属性的模拟代码
如何使方法填充父类字段并使用它创建子类?

我试过了:

 public static ParentViewModel MakeParent()
 {
    var parent = new ParentViewModel
    {
      Id = ...
      Name = ...
      ...And another properties...
    }
    return parent;
 }
 public static ChildViewModel_1 MakeChild_1()
 {
    var parent = MakeParent();
    var child= parent as ChildViewModel_1;
    child.Note = ...
    return child;
 }

但我期望得到child = null
我读过这篇文章,但看起来很难
有什么建议吗?

如何重写方法返回类型

生成子对象,然后从父对象调用一些函数来设置特定于父对象的值。然后从子级调用函数以生成特定于子级的值。

父级特定的初始化可以在父级的构造函数中。

扩展辩证法的答案,下面是如何做到这一点:

class Parent
{
    public string Name { get; set; }
    public int ID { get; set; }
}
class Child : Parent
{
    public string Note { get; set; }
}
class Factory
{
    public static Parent MakeParent()
    {
        var parent = new Parent();
        Initialize(parent);
        return parent;
    }
    private static void Initialize(Parent parent)
    {
        parent.Name = "Joe";
        parent.ID = 42;
    }
    public static Child MakeChild()
    {
        var child = new Child();
        Initialize(child);
        child.Note = "memento";
        return child;
    }
}

使用构造函数

在基类和子类中指定一个构造函数,使用以下构造函数:

public class ParentViewModel
{
    public int Id { set; get; }
    public string Name { set; get; }
    protected ParentViewModel(int Id, string Name)
    {
        this.Id = Id;
        this.Name = Name;
    }
}
public class ChildViewModel_1 : ParentViewModel
{
    public string Notes { set; get; }
    public ChildViewModel_1(int Id, string Name, string Notes)
        : base(Id, Name) //Calling base class constructor
    {
        this.Notes = Notes;
    }
    public static ChildViewModel_1 MakeChild_1()
    {
        return new ChildViewModel_1(0, "Some Name", "Some notes");
    }
}

(不确定为什么需要静态方法来创建对象,如果静态方法是子类的一部分,并且您只想通过此方法公开对象创建,则使您的子构造函数private