Sean Anderson
Sean Anderson

Reputation: 29251

Struggling to implement abstract property in derived class

This all got a little trickier than I had intended. I'm using the HistoricalReportWrapper class because I retrieve my data through an API which has made it not realistic to have HistoricalReport implement IReport directly.

public abstract class CormantChart : Chart
{
    public abstract IReport Report { get; protected set; }
}

public abstract class HistoricalChart : CormantChart
{
     public override HistoricalReportWrapper Report { get; protected set; }

     public HistoricalChart(HistoricalChartData chartData) : base(chartData)
     {
         Report = GetHistoricalReport(chartData.ReportID);
     }

     protected HistoricalReportWrapper GetHistoricalReport(int reportID)
     {
         return SessionRepository.Instance.HistoricalReports.Find(historicalReport => int.Equals(historicalReport.ID, reportID));
     }
}

public class HistoricalReportWrapper : IReport
{
    public HistoricalReport inner;

    public int ID
    {
        get { return inner.ID; }
        set { inner.ID = value; }
    }
    public string Name
    {
        get { return inner.Name; }
        set { inner.Name = value; }
    }

    public HistoricalReportWrapper(HistoricalReport obj)
    {
        inner = obj;
    }
}

public interface IReport
{
    string Name { get; set; }
    int ID { get; set; }
}

The idea here is that when I am working inside of the HistoricalChart class I need to be able to access specific properties of the HistoricalReport. The rest of my program, however, only needs to have access to the HistoricalReport's ID and Name. As such, I would like to expose IReport's properties to the world, but then keep the details contained to the class.

As it stands, all the classes which inherit HistoricalChart generate a "does not implement inherited abstract member" as well as a warning on HistoricalChart indicating that I am hiding CormantChart's Report.

What's the proper way to declare this to achieve what I'd like?

Thanks

EDIT: Whoops, I missed an override. Now, when I try to override CormantChart Report I receive:

'CableSolve.Web.Dashboard.Charting.Historical_Charts.HistoricalChart.Report': type must be 'CableSolve.Web.Dashboard.IReport' to match overridden member 'CableSolve.Web.Dashboard.Charting.CormantChart.Report'    C

EDIT2: Taking a look at C#: Overriding return types might be what I need.

Upvotes: 0

Views: 2025

Answers (1)

Henk Holterman
Henk Holterman

Reputation: 273169

Because

 public HistoricalReportWrapper Report { get; protected set; }

is not an implementation of

 public abstract IReport Report { get; protected set; }

Upvotes: 2

Related Questions