Интерфейсті іске асырмайтын, бірақ барлық біліктілікке сәйкес келетін, интерфейсті күткен тізімге қосыңыз

Менде мыналар бар:

List myList = new List();

Report myReport = TheirApi.GetReport();

myReport IReport-тің барлық біліктіліктеріне жауап береді, бірақ IRAP-ті іске асыра алмайды, себебі менде олардың Aida-ның көзіне қол жеткізе алмаймын. IReport түріне көшіру нөлге әкеледі және мен анонимдік түрін интерфейске шығара алмайтындығын оқыдым.

Мұнда қандай да бір нұсқа бар ма?

Дәрігердің бұйрығы:

ReportServices.GetAllCustomReports().ToList().ForEach(customReport => _customReports.Add(new ReportWrapper(customReport)));

public class ReportWrapper : IReport
{
    private Report inner;

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

    public ReportWrapper(Report obj)
    {
        inner = obj;
    }
}
3

2 жауаптар

Сіз бұл нысанды интерфейсті іске асыратын басқа бөлікке орап, содан кейін оны ішкі нысанның қасиеттері мен әдістеріне шақыратын іске қосуыңыз керек.

Мысалға:

public class ReportWrapper : IReport
{
    MyObjectIsLikeReport inner;

    public ReportWrapper(MyObjectIsLikeReport obj) {
        this.inner = obj;
    }

    public void ReportMethod(int value) {
        this.inner.ReportMethod(value);
    }

    public int SomeProperty {
        get { return this.inner.SomeProperty; }
        set { this.inner.SomeProperty = value; }
    }
}

Оны пайдалану үшін сіз мұны істей аласыз:

List myList = new List();
MyObjectIsLikeReport myReport = TheirApi.GetReport();
myList.Add(new ReportWrapper(myReport));
5
қосылды
Жақсы. Рақмет сізге!
қосылды автор Sean Anderson, көзі
Жоқ, бұл өте жақсы жұмыс істеді !! Менің шешімімде өңдеу.
қосылды автор Sean Anderson, көзі
Өкінішке орай, мұны істеудің автоматтандырылған тәсілі жоқ. Егер сізге қосымша көмек қажет болса, түсініктеме қалдырыңыз. =)
қосылды автор Miguel Angelo, көзі

Адаптер дизайнының үлгісін қарастырыңыз.

Анықтама : сыныптың интерфейсін басқа интерфейске айналдыру   клиенттер күтеді. Адаптор сабақтарды бірлесіп жұмыс істеуге мүмкіндік бермейді   әйтпесе үйлесімді емес интерфейстер.

good reference: http://www.dofactory.com/Patterns/PatternAdapter.aspx

interface IReport
{
    void DoSomething();
}

class ReportApdapter : IReport
{
    private readonly Report _report;

    public ReportApdapter(Report report)
    {
        _report = report;
    }

    public void DoSomething()
    {
        _report.DoSomething();
    }
}

class Report
{
    public void DoSomething()
    {
    }
}


//You can use like this.
IReport report = new ReportApdapter(TheirApi.GetReport());
1
қосылды