3

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

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 的类中放置一个构造函数来复制所有属性值,但是基类 A 有很多属性并且很可能添加了更多属性,所以我担心缺少一个或忘记添加它当我将其添加到 A 时,将其添加到 B 的构造函数中。请问有没有一种简单的方法可以做到这一点?

- - - -编辑 - - -

谢谢大家,不幸的是,不是我的用例,这是一个伙伴向我开火的问题。据我所知,存在问题,他无法更改基类。据我了解,基类是一个与数据库调用挂钩的类,然后他想要获取该数据并为管理员编辑屏幕添加一些额外的属性,然后他的代码将使用这些属性来更新基本数据对象的属性。我的第一反应是将基础对象作为他对象的属性,但他使用他使用的工具将其“展平”要容易得多,这是有原因的。我没想到有一种方法可以做到这一点,但我想我会检查以防我遗漏了什么——我认为只问基本问题会更容易,而不是包括背景,这可能只会引发更多问题和混乱水(AFAIK 他正遭受“他无法控制的情况”,与此有关)。

4

4 回答 4

2

我知道我可以在 B 的类中放置一个构造函数来复制所有属性值,但是基类 A 有很多属性并且很可能添加了更多属性,所以我担心缺少一个或忘记添加它当我将其添加到 A 时,将其添加到 B 的构造函数中。请问有没有一种简单的方法可以做到这一点?

通常,这是设计缺陷的标志。我会首先重新考虑您的设计并确定这是否真的有必要,或者您是否可以在这里使用另一种方法。话虽如此...

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

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

于 2012-09-06T16:21:28.883 回答
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; }
    }
于 2012-09-06T16:49:19.827 回答
0

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

如果您只需要孩子和父母都实现通用方法,以便当其中一个对象传递给某个函数时,它可以对传入对象的某些通用方法进行操作,那么只需让它们两个实现相同接口(多态),或将函数参数键入为基类,并确保方法存在于基类中。

于 2012-09-06T16:34:45.043 回答
0

c# 不支持反向多态。

于 2012-09-06T16:22:12.353 回答