【发布时间】:2020-04-16 02:57:45
【问题描述】:
代码示例先:
public class Child1 : Parent
{
private int _value;
public int Value => _value;
public void Initialize(Random random)
{
base.Initialize();
_value = random.Next(1,100);
}
}
public class Child2 : Parent
{
private double _value;
public double Value => _value;
public void Initialize(Random random)
{
base.Initialize();
_value = random.NextDouble();
}
}
public class Parent
{
private bool _initialized;
private string _id;
public string Id => _id;
protected void Initialize()
{
if(!_initialized)
{
_id = System.Guid.NewGuid().ToString();
}
}
}
我想做什么:
class Program
{
private Parent[] _things = new Parent[] {new Child1(), new Child2(), new Child1()}
private Random _random = new Random();
static void Main(string[] args)
{
foreach (var thing in _things)
{
thing.Initialize(_random);
}
}
}
但是这段代码不起作用,因为它试图调用受保护的初始化而不是子类初始化。正如我在this question 中所读到的,您不能将对象从父类转换为其子类。
我觉得从逻辑上讲,这种构造是有道理的,因为父类可以容纳所有公共字段和逻辑,而子类则有差异,并在自己的初始化方法中做不同的事情。 我想在数组中轻松处理混合的一堆子类并调用它们的初始化函数。并且永远不应该存在自己初始化的父类。
我是不是在做一些根本性的错误,这种构造是否有不同的方法,可以让我调用一堆不同子类的初始化方法?
我非常感谢一个工作代码示例。
【问题讨论】:
-
你错过了继承吗? child 是父类的子类?
-
由于父类没有公共的初始化方法,你不能从父类对象中调用它。你需要有公共方法。或者您需要将 Parent 对象转换为适当的子类对象,然后对其调用方法。
-
为什么Parent类不能有public Initialize方法?
-
父母需要
public virtual void Initialize,然后孩子需要public override void Initalize。正如 rt2800 所说,您需要在子类中继承 Parentpublic class Child1 : Parent -
是的,抱歉,我忘记了示例中的继承。固定。