如何覆盖方法返回类型?

时间:2014-11-05 15:00:38

标签: c# class

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

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;}
}

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

 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 我看了this,但看起来很困难 有什么建议吗?

3 个答案:

答案 0 :(得分:2)

创建子项,然后从父项调用某些函数来设置父项特定值。然后从子函数调用函数以生成子特定值。

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

答案 1 :(得分:1)

扩展Dialecticus&#39;回答,你可以这样做:

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;
    }
}

答案 2 :(得分:0)

使用constructors

在基类和子类中指定构造,使用构造函数,如:

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");
    }
}

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