C#:关于接口、实现和继承的困惑

本文关键字:实现 继承 于接口 接口 | 更新日期: 2023-09-27 18:29:17

如果我需要公开数据接口,但又想在内部使用扩展的计算属性,我想知道该怎么办。为了更清楚:

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

我真的很沮丧,因为我觉得错过了一些基本的编程技能。

C#:关于接口、实现和继承的困惑

您可以通过将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;
        }
    }    
}

并将其用于类似的CCD_ 1

 IExtendedData tempData = new ExtendedData(data);

ExtendedData可以从Data:继承

class ExtendedData : Data
{...}

为了创建Data对象,您添加了一个工厂,如下所示:

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

用户必须通过该工厂创建其所有数据对象。您可以通过将Data的构造函数设置为内部构造函数来确保这一点
在DLL中,您可以转换为ExtendedData