我有一个A
从中B
继承的类。A
有一个名为的属性Data
,它是一个包含一些数据的类。还有就是BData
再次继承自data
.
换句话说:
class A
{
public Data data;
}
class B : A
{
public new BData data;
}
class Data
{
public string id = "something";
}
class BData : Data
{
public new string id = "something else";
}
现在,我使用一种方法从任何类中读取数据并根据数据执行一些逻辑。
public bool ReadData<T>(T element) where T : A
{
Console.WriteLine($"Element: {element}");
Console.WriteLine($"Element ID: {element.data.id}");
//do some logic
}
我为它制作了一个测试元素,A
然后B
将它传递给这样的方法:
A a = new A();
a.data = new Data();
B b = new B();
b.data = new BData();
ReadData<A>(A);
ReadData<B>(b);
我得到的输出是这样的:
元素:A
元素 ID:某物
元素:B
元素 ID:
我不明白为什么当我传递第二个对象时,它有一个空属性。我怀疑它可能与不同的类型有关(需要从B
to 转换A
?是因为我在躲藏Data
吗BData
?)但我无法弄清楚。我错过了什么吗?
是什么导致这种情况发生,我该如何解决?
这
class B : A
{
public new BData data;
}
不会使旧data
领域
class A
{
public Data data;
}
类消失。它不会取代它,它只是隐藏它。然后
public bool ReadData<T>(T element) where T : A
将每个对象视为A
. 特别是当您初始化时,B
其public Data data
(基A
类的)字段未初始化,因此保持为空。然后即使你通过B
了,它实际上也会尝试访问它data
的类字段A
。
如果您将其更改B
为
class B : A
{
public BData data2;
}
这个故事的寓意是:new
关键字很危险,避免它。
以下是如何使用属性而不是字段来实现您想要的。像这样的东西应该工作:
class A
{
public Data data { get; set; }
}
class B : A
{
public new BData data {
get {
return (BData)base.data;
}
set {
base.data = value;
}
}
}
但我鼓励您使用通用接口来B
代替A
这些技巧。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句