簡體   English   中英

從基本構造函數C#調用基類重寫方法

[英]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實例來解決此問題,但是在那種情況下,我無法在基類中聲明NumberOfFieldsabstract (這是我需要的)。

解決此問題的正確方法是什么? 設計有問題嗎?

您制定此方法的方式可能無法按預期工作。 假設它確實 (通過某種魔術)按照您認為的方式工作,並且您能夠創建ChildRecord

var record = new ChildRecord(new double[] { 1.0, 1.5, 2.5 });

您期望record.NumberOfFields的值是什么? 兩三個? 此特定對象不能是NumberOfFields == 3ChildRecord ,而不能是NumberOfFields == 2Record 無論您將record鍵入為ARecordRecord還是ChildRecord ,您都可以獲得實例化類的NumberOfFields實現的結果。

ARecord.NumberOfFields ,將ARecord.NumberOfFieldsARecord.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM