[英]Call base class override method from base constructor C#
我想要一個具有索引器和字段數的類,如以下示例所示:
public abstract class ARecord
{
public abstract double this[int index] { get; }
public abstract int NumberOfFields { get; }
}
public class Record : ARecord
{
public double Field1{ get; private set; }
public double Field2{ get; private set; }
public override int NumberOfFields { get { return 2; } }
public Record(double[] records)
{
if (records.Count() != NumberOfFields) // PROBLEM IS HERE. WHEN CALLING THIS FROM DERIVED CLASS NumberOfFields=3!
throw new ArgumentException();
this.Field1= records[0];
this.Field2 = records[1];
}
public override double this[int index]
{
get { throw new NotImplementedException(); }
}
}
public class ChildRecord : Record
{
public double Field3 { get; private set; }
public override int NumberOfFields { get { return 3; } }
public ChildRecord(double[] records)
: base(new double[] { records[0], records[1] })
{
if (records.Count() != NumberOfFields)
throw new ArgumentException();
this.Field3 = records[2];
}
public override double this[int index]
{
get { throw new NotImplementedException(); }
}
}
public static class TestRecord
{
public static void CreateRecord()
{
var record = new ChildRecord(new double[]{1.0,1.5,2.5}); // Not working
}
}
此示例崩潰是由於Record
構造函數中ChildRecord
的多態調用NumberOfFields
。
據我所知,我可以使用override
new
實例來解決此問題,但是在那種情況下,我無法在基類中聲明NumberOfFields
為abstract
(這是我需要的)。
解決此問題的正確方法是什么? 設計有問題嗎?
您制定此方法的方式可能無法按預期工作。 假設它確實 (通過某種魔術)按照您認為的方式工作,並且您能夠創建ChildRecord
:
var record = new ChildRecord(new double[] { 1.0, 1.5, 2.5 });
您期望record.NumberOfFields
的值是什么? 兩三個? 此特定對象不能是NumberOfFields == 3
的ChildRecord
,而不能是NumberOfFields == 2
的Record
。 無論您將record
鍵入為ARecord
, Record
還是ChildRecord
,您都可以獲得實例化類的NumberOfFields
實現的結果。
ARecord.NumberOfFields
,將ARecord.NumberOfFields
暴ARecord.NumberOfFields
是沒有意義的,因為沒有一個正確的答案-這不是一個有意義的概念。
如果您不公開它,則可以進行如下驗證(省略索引器和屬性):
public abstract class ARecord
{
public abstract double this[int index] { get; }
}
public class Record : ARecord
{
private const int NumberOfFields = 2;
public Record(double[] records)
{
if (records.Count() != NumberOfFields)
throw new ArgumentException();
this.Field1 = records[0];
this.Field2 = records[1];
}
}
public class ChildRecord : Record
{
private const int NumberOfFields = 3;
public ChildRecord(double[] records)
: base(new double[] { records[0], records[1] })
{
if (records.Count() != NumberOfFields)
throw new ArgumentException();
this.Field3 = records[2];
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.