从继承类的实例轻松转换

时间:2012-09-06 16:19:09

标签: c# .net inheritance

我有两个类,一个继承另一个,例如: -

public class A
{
    public string AA { get; set; }
    public double AB { get; set; }
}

public class B : A
{
    public double? BA { get; set; }
}

现在,我知道如果我有一个对象B的实例,我可以将其转换为类型A,但我有一个A实例,我想将其实例化为类型B对象。我知道我可以在B&#39的类中放置一个构造函数来复制所有的属性值,但基类A有很多属性,可能会有更多的属性,所以我担心失踪当我将它添加到A时,忘记将其添加到B的构造函数中。是否有一种简单的方法可以做到这一点,

------- ------编辑

感谢大家,不幸的是,不是我的用例,这是一个伙伴向我开除的问题。据我所知,存在问题,他无法改变基类。根据我的理解,基类是挂钩到数据库调用的基类,然后他想要获取该数据并为管理编辑屏幕添加一些额外的属性,然后他的代码将使用它来更新基础数据对象' s属性。我的第一个反应是将基础对象作为其对象的属性,但是有一个原因让它更容易让它变得平坦"使用他正在使用的工具。我没有想到有办法做到这一点,但我想我会检查以防错过一些东西 - 我觉得要问基本问题会更容易而不是包括背景,这可能只会引起更多的问题并使水变得混乱(AFAIK他正在遭受"他无法控制的情况",有了这个)。

4 个答案:

答案 0 :(得分:2)

  

我知道我可以在B的类中放置一个构造函数来复制所有的属性值,但是基类A有很多属性,可能会有更多的属性,所以我担心错过一个或遗忘当我将它添加到A时,将它添加到B的构造函数中。有一种简单的方法吗?请

通常,这是设计缺陷的标志。我会重新考虑您的设计首先,并确定这是否真的有必要,或者您是否可以使用其他方法。那就是说......

没有简单的方法可以做到这一点。如果您需要从B实例创建A实例,则确实需要将值复制到新实例。

但是,更好的选择可能是在protected添加(可能是A)构造函数,以便在给定另一个A实例的情况下设置所有这些属性。然后B可以使用它来创建自己,这至少保留了匹配定义它们的类中所有属性的要求。随着时间的推移,这应该更容易维持这一点。

答案 1 :(得分:1)

我同意其他评论,你最好使用不同的设计,例如构图而不是继承。

如下所示,组合允许您修改A类,而无需对B类进行任何更改。

    public class B
    {
        // Constructor
        public B(A A) { this.A = A; }

        // Class A as a read-only property
        public A A { get; private set; }

        // Other properties of class B
        public double? BA { get; set; }
    }

答案 2 :(得分:0)

c#不支持反向多态性。

答案 3 :(得分:0)

正如Reed Copsey所说,这通常是设计缺陷的标志。如果您需要这样的工作,我会重新编写类图。听起来在某处的继承架构中犯了某种错误。

如果你需要的只是child和parent都要实现常用方法,那么当任何一个对象传递给某个函数时,它可以对传入的对象上的一些常用方法进行操作,然后只需要它们中的两个实现相同的接口(多态),或者输入函数参数作为基类,并确保方法存在于基类中。