我有一個從Agent
繼承的子類Bicycle
。代理商有一個屬性取決於自行車來定義它。即,代理的物理模型需要用基於每個自行車定義的速度和加速度約束來初始化,並且對於另一種類型的代理將是不同的。強制子類在計算後初始化父屬性
我遇到的問題是,我無法通過我需要計算的參數(速度/加速度需要計算從理論分佈中繪製它們),因爲當然,子類還沒有構造器在base()
構造函數中被實例化。
每個單車實例計算一次,但多次使用,所以一個簡單的靜態方法將無法完成這項工作。在計算完父母后,我可以在父母中調用protected
方法,但AFAIK無法在孩子中執行此操作,尤其是在未來的孩子中,我可能不會寫這些方法。
因此,例如,我可以:
public abstract class Agent
{
protected IPhysics PluginPhysics { get; set; }
protected Agent(...)
{
}
}
public class Bicycle : Agent
{
private double maxA;
public Bicycle(Object anotherParameter) : base(...)
{
maxA = ComputationOfMaxA();
this.PluginPhysics = new Physics(anotherParameter, maxA);
}
private static double ComputationOfMaxA()
{
...
}
...
}
我也可以:
public abstract class Agent
{
protected IPhysics PluginPhysics { get; private set; }
protected Agent(...)
{
}
protected void SetupPhysics(Physics physics)
{
this.PluginPhysics = physics;
}
}
public class Bicycle : Agent
{
private double maxA;
public Bicycle(Object anotherParameter) : base(...)
{
maxA = ComputationOfMaxA();
SetupPhysics(new Physics(anotherParameter,maxA));
}
private static double ComputationOfMaxA()
{
...
}
...
}
我寧願不做這類原因,因爲沒有編譯時的方式,以確保兒童初始化我可以想到的PluginPhysics
,並且我寧願PluginPhysics
一旦它被初始化就不能被改變。我也寧願沒有需要在Bicycle
類之外的部分Physics
。我明白所有這些事情可能不是同時可能的。
因此,在調用任何相關類對象之前,在父類中缺少措辭強烈的文檔或一堆運行時空的檢查,是否存在明顯的C#方式 - 我缺少強制一個孩子在使用前初始化一個父類字段,如果你不能在構造函數中做?
我調整了一下代碼,使其更加明顯,您在創建物理對象之前依靠ComputationOfMaxA完成。 –