1

我一直在研究一些电网模拟软件(ElecNetKit)。在电网中,有时使用单相模型很方便,有时使用三相模型。

因此,我希望能够将其中一个电气网络元素表示为:

class Bus
{
    public Complex Voltage {set; get;} //single phase property
}

但同时以一种方式,以便用户可以调用Bus.Voltage.Phases[x],并期望 aComplex为任何有效的整数x

Bus.Voltage属性应Bus.Voltage.Phases[1]在被视为 时映射到Complex

我这里有两个问题:

  1. 这是否违反任何 OOP 原则?我有一种感觉,可能是。
  2. 有没有一种方便的方法可以在 C# 中表示它?

在表示方面,我尝试过:

  • 一个 class Phased<T> : T,但这与打字系统不兼容,并且
  • 一个Phased<T>具有通用转换器类型的类T,但仍需要调用转换器。

我知道我可以简单地使用类似的东西:

public Dictionary<int,Complex> VoltagePhases {private set; get;}
public Complex Voltage {
    set {VoltagePhases[1] = value;} 
    get {return VoltagePhases[1];}
}

但是,一旦您开始对多个属性、跨多个类执行此操作,就会有很多重复。

4

2 回答 2

1

你能做这样的事情吗?这将类似于您在底部的解决方案,但由于通用类,您不会为每个属性重复代码。

class Program
{
    static void Main(string[] args)
    {
        Collection<Complex> complex = new Collection<Complex>();
        //TODO: Populate the collection with data

        Complex first = complex.First;
        Complex another = complex.Items[2];
    }
}

public class Complex
{
    // implementation
}


public class Collection<T> where T : class
{
    public List<T> Items { get; set; }

    public T First
    {
        get
        {
            return (Items.Count > 0) ? Items[1] : null;
        }
        set
        {
            if(Items.Count > 0) 
                Items[1] = value;
        }
    }
}
于 2013-01-11T00:03:25.653 回答
1

我会提出这样的建议:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Diagnostics;
using System.Numerics;

namespace Test
{
    class PhaseList
    {
        private Dictionary<int, Complex> mPhases = new Dictionary<int, Complex>();

        public Complex this[int pIndex]
        {
            get
            {
                Complex lRet;
                mPhases.TryGetValue(pIndex, out lRet);
                return lRet;
            }
            set
            {
                mPhases.Remove(pIndex);
                mPhases.Add(pIndex, value);
            }
        }
    }

    class PhasedType
    {
        private PhaseList mPhases = new PhaseList();
        public PhaseList Phases { get { return mPhases; } }
        public static implicit operator Complex(PhasedType pSelf)
        {
            return pSelf.Phases[1];
        }

        public static implicit operator PhasedType(Complex pValue)
        {
            PhasedType lRet = new PhasedType();
            lRet.Phases[1] = pValue;
            return lRet;
        }
    }

    class Bus
    {
        public PhasedType Voltage { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Bus lBus = new Bus();

            lBus.Voltage = new Complex(1.0, 1.0);
            Complex c = lBus.Voltage;
            lBus.Voltage.Phases[1] = c;
            c = lBus.Voltage.Phases[1];
        }
    }
}
于 2013-01-11T00:14:23.773 回答