gpt4 book ai didi

C#继承。从基类派生类

转载 作者:可可西里 更新时间:2023-11-01 03:04:50 31 4
gpt4 key购买 nike

我有一个基类

public class A   
{
public string s1;
public string s2;
}

我还有一个派生类:

public class B : A
{
public string s3;
}

假设我的程序创建了一个类 A 的实例。

A aClassInstance = new A();

设置了一些参数:

aClassInstance.s1 = "string 1";
aClassInstance.s2 = "string 2";

此时我想创建一个类 B 的实例。但我希望 B 已经具有我的类 A 实例的值。

这没有用:

public B bClassInstance = new B():
bClassInstance = (B)aClassInstance;

这也没有:

在A类中做了一个clone方法。

public B cloneA() {    
A a = new A();
a = (A)this.MemberwiseClone()
return(B)a;
}

VS 代码采用了上述两种方法 - 但我遇到了运行时错误

请帮忙

最佳答案

您遇到的基本问题是,您必须构造一个 B 类型的实例(其中包含 A 类型的属性)。您克隆 A 实例的方法将不起作用,因为这会为您提供 A 类型的实例,您无法将其转换为 B.

我会为类 A 和 B 编写构造函数,它们接受类型 A 的参数。类 B 的构造函数只是将值传递给它的基类 A。类 A 的构造函数知道如何将字段复制到自身:

class A {
public A(A copyMe) {
s1 = copyMe.s1;
...
}

class B : A {

public B(A aInstance) : base(aInstance) {
}

}

这样使用:

A a = new A();
a.s1 = "...";

B b = new B(a);

编辑

当您不想在添加新字段或属性时更改 A 的构造函数时,您可以使用反射来复制属性。要么使用自定义属性来装饰你想要复制的内容,要么只复制 A 的所有属性/字段:

public A (A copyMe) {
Type t = copyMe.GetType();
foreach (FieldInfo fieldInf in t.GetFields())
{
fieldInf.SetValue(this, fieldInf.GetValue(copyMe));
}
foreach (PropertyInfo propInf in t.GetProperties())
{
propInf.SetValue(this, propInf.GetValue(copyMe));
}
}

我还没有尝试过代码,但重点应该很清楚了。

关于C#继承。从基类派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8631898/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com