1

从我读过的内容来看,似乎没有一种将类从基类转换为继承类的好方法。

按照这个问题的答案,我继续创建了一个构造函数,它将基类的实例作为参数。

构造函数如下所示:

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

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

有没有办法利用派生类从基类继承这一事实来使这个构造函数不那么脆弱?

4

2 回答 2

4

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

我已经继续并刚刚创建了一个构造函数,它以基类的实例作为参数。

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

有没有办法利用派生类从基类继承这一事实来使这个构造函数不那么脆弱?

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

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" };
于 2013-04-02T22:24:35.763 回答
0

您能否不向执行分配的基类添加受保护的构造函数,然后将基类作为参数传递给它:

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

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

于 2013-04-02T22:25:22.110 回答