【问题标题】:Is there a way to leverage inheritance when including a parameter of the base class in a constructor?在构造函数中包含基类的参数时,有没有办法利用继承?
【发布时间】:2013-03-24 10:03:12
【问题描述】:

根据我的阅读,似乎没有将类从基类转换为继承类的好方法。

按照this 问题中的答案,我继续前进,刚刚创建了一个构造函数,该构造函数将基类的实例作为参数。

构造函数如下所示:

public DerivedClass(BaseClass base) {
    this.Id = base.Id;
    this.Foo = base.Foo;
    // ..
    this.NewProperty = SomeNewValue;
}

等等。这也意味着如果基类获得一个新属性,派生类中的构造函数也需要修改才能复制该属性。

有没有办法利用派生类从基类继承这一事实来降低构造函数的脆弱性?

【问题讨论】:

  • 您可以将代码连同其余部分一起发布,而不是发布链接。这样人们就不必来回跳转
  • 你能举一个更具体的例子吗?什么情况下你手头有 Animal 需要建造 Tiger?
  • 在我有一群动物的情况下,我过滤到我想制作老虎的那些,现在我想拥有一群老虎。

标签: c# asp.net inheritance


【解决方案1】:

您似乎没有完全掌握继承,并且您已经过度考虑了您需要做什么。

我刚刚创建了一个以基类实例作为参数的构造函数。

在扩展(继承)基类时不需要这样做,只有在包装类时才这样做。

有没有办法利用派生类从基类继承这一事实来降低构造函数的脆弱性?

是的:使用构造函数重载。给定这个基类:

public class MyBase
{
    public virtual string Name { get; set;}
}

可以这样做:

public class MyExtendedClass : MyBase 
{
    public MyExtendedClass(string name)
    {
        Name = name;
    }
}

但更好的是像这样利用构造函数重载,将构造函数参数传递给基类构造函数:

public class MyBase
{

    public MyBase(string name)
    {
        Name = name;
    }

    public virtual string Name { get; set;}
}

public class MyExtendedClass : MyBase 
{
    public MyExtendedClass(string name) : base (name) {   }
}

您倾向于在构造函数中为您希望不可变的属性传递值。对于其他人,您可以利用内联初始化:

var myNewClass = new MyExtendedClass() { Name = "blah" };

【讨论】:

    【解决方案2】:

    你能不能在基类中添加一个受保护的构造函数来执行赋值,然后将基类作为参数传递给它:

    protected BaseClass(BaseClass source)
    {
        this.Id = source.Id;
        this.Foo = source.Foo;
        ...
    }
    

    从而保持代码在基类本身中复制基类?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-02
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      相关资源
      最近更新 更多