Composition with fluent interfaces

5

I'm trying to make a class using composition, fluent methods and I'm having some problems.

I would like to access a property of a composite method through fluent interfaces but I can not implement the abstract method.

The case is as follows:

// Classe base para composição
public abstract class Foo
{
    // Propriedade base
    public string Param1 { get; set; }

    // Método base para retorno da classe (usado com interfaces fluentes)
    public abstract Foo GetData();
}

// Classe que compoe Foo
public class Bar : Foo
{
    // Propriedade particular de Bar
    public string Param2 { get; set; }

    // Método para retorno da própria classe (usado com interfaces fluentes)
    // Aqui eu não consigo criar o método
    public override Bar GetData()
    {
        return this;
    }
}

// Classe que utiliza
public class Test
{
    public Test()
    {
        // Acesso à propriedade particular da classe compositiva
        var newBar = new Bar().GetData().Param2;
    }
}

Does anyone have any idea how to do this?

    
asked by anonymous 08.10.2014 / 20:23

1 answer

3

You should use generic in the base class, use "T" as the return of "GetData", and inherit from that class pass the type you want to use in the "GetData" method:

// Classe base para composição
public abstract class Foo<T>
{
    // Propriedade base
    public string Param1 { get; set; }

    // Método base para retorno da classe (usado com interfaces fluentes)
    public abstract T GetData();
}

// Classe que compoe Foo
public class Bar : Foo<Bar>
{
    // Propriedade particular de Bar
    public string Param2 { get; set; }

    // Método para retorno da própria classe (usado com interfaces fluentes)
    // Aqui eu não consigo criar o método
    public override Bar GetData()
    {
        return this;
    }
}

// Classe que utiliza
public class Test
{
    public Test()
    {
        // Acesso à propriedade particular da classe compositiva
        var newBar = new Bar().GetData().Param2;
    }
}
    
08.10.2014 / 20:30