C #: путаница по поводу интерфейсов, реализации и наследования - PullRequest
2 голосов
/ 27 марта 2012

Мне интересно, как идти дальше, нужно ли мне публиковать интерфейсы данных, но я хочу использовать их внутри с расширенными вычисляемыми свойствами. Чтобы было понятнее:

// 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;
    }
}

Я очень расстроен, потому что мне не хватает некоторых базовых навыков программирования.

Ответы [ 2 ]

3 голосов
/ 27 марта 2012

Эту проблему можно решить, реализовав ExtendedData в качестве оболочки для класса, реализующего 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;
        }
    }    
}

, и использовать его в DoSomeCalculation как

 IExtendedData tempData = new ExtendedData(data);
0 голосов
/ 27 марта 2012

ExtendedData может наследоваться от данных:

class ExtendedData : Data
{...}

И для создания Data объекта вы добавляете фабрику примерно так:

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

Пользователь должен создать все свои Данные объектов этой фабрикой. Вы можете убедиться в этом, сделав конструктор Data внутренним.
В вашей DLL вы можете привести к ExtendedData.

...