germanSharper
germanSharper

Reputation: 971

C#: Confusion about Interfaces, Implementation and Inheritance

I'm wondering about what's the way to go, if I need to publicate data-interfaces but want to use them internal with extended calculated properties. To make it clearer:

// The public interface
public interface IData
{
    int Property { get; }
}

// The internal interface
internal interface IExtendedData : IData
{
    int ExtendedProperty { get; }
}

// The assumed implementation of someone using my interface
public class Data : IData
{
    public Data(int a)
    {
        Property = a;
    }

    public int Property
    {
        get;
        private set;
    }

    public override string ToString()
    {
        return Property.ToString();
    }
}

// My implementation
internal class ExtendedData : IExtendedData
{
    public ExtendedData(int a)
    {
        Property = a;
    }

    public int Property
    {
        get;
        private set;
    }

    public int ExtendedProperty
    {
        get
        {
            return 2 * Property;
        }
    }

    public override string ToString()
    {
        return Property.ToString() + ExtendedProperty.ToString();
    }
}

// publicated by me, for the person who uses my dll
public static class Calculations
{
    public static int DoSomeCalculation(IData data, int parameter)
    {
        // This probably don't work, but maybe shows what I want to do
        IExtendedData tempData = (ExtendedData)data;
        return tempData.ExtendedProperty * parameter;
    }
}

I'm realy frustrated, cause I feel like missing some basical programing skills.

Upvotes: 2

Views: 270

Answers (2)

brgerner
brgerner

Reputation: 4371

ExtendedData could inherit from Data:

class ExtendedData : Data
{...}

And for creation of a Data object you add a factory like so:

public class DataFactory
{
    public IData CreateData()
    {
        return new ExtendedData();
    }
}

User have to create all its Data objects by this factory. You can ensure it by making Data's constructor internal.
In your DLL you can then cast to ExtendedData.

Upvotes: 0

Jens
Jens

Reputation: 25563

You could solve this problem by implementing ExtendedData as a Wrapper for a class implementing IData

internal class ExtendedData : IExtendedData
{

    private IData data;
    public ExtendedData(IData data)
    {
        this.data = data;
    }

    public int Property
    {
        get { return data.Property; }
        private set { data.Property = value; }
    }

    public int ExtendedProperty
    {
        get
        {
            return 2 * Property;
        }
    }    
}

and use this in DoSomeCalculation like

 IExtendedData tempData = new ExtendedData(data);

Upvotes: 3

Related Questions