2012-04-26 19 views
1

私はこれを間違っていると感じています。私はクラスを抽象化するのが初めてで、チュートリアルを少し読んでいますが、私の状況にそれを適用する方法を理解することはできません。私のデザインは間違っているかもしれないと思いますが、私はそれをやるための別の方法を考えることはできません。私の会社はいくつかの異なるコンピュータを作っているので、バッテリーの情報を監視する必要があります。情報を得ることは問題ではありませんが、基本クラスにさまざまなコマンドを送信して、必要な処理を実行する方法を考え出します。セル1の電圧を取得したいとします。あるユニットでは、コマンドは0x0418であり、別のユニットでは0x453です。私の情報クラスでは、モデルが何であるかを調べるためのテストを実行します。私はそれぞれのバッテリー(セル電圧、充電IC、充電電流など)のための標準である変数の束を持っているバッテリーと呼ばれるベースクラスを持っている私はその後、バッテリーを拡張する私のユニットのそれぞれの個別のクラスを作ることが良いと決めた。継承したクラスのメソッドが基底クラスに渡された

私が思うようなクラスのデザインは、私が抽象と多相をうまく使っていないので間違っている可能性があります。私は最終的に私がBatteryInformationクラスから得た情報を表示するパネルを持っています。 Battery1Cell1Label.Text = batteryInfo.GetCell1(1);のようなものです。 Battery2Cell1Label = batteryInfo.GetCell1(2)。

私の基本クラスでは、GetValue(バイトコマンド)が必要であると思います。(これは、さまざまな種類の情報を取得するための組み込みコントローラコマンドです。)たぶん私は話を止めて、私が持っているエラーを教えてください。 DRAFTの保存に

battery.cs

public abstract class Battery<T> //not sure that the <T> is right 
{ 
    public string Information { get; private set; } 
    public float Cell1 { get; private set; } 
    public float Cell2 { get; private set; } 
    public float Cell3 { get; private set; } 
    public float Cell4 { get; private set; } 
    public int FCC { get; private set; } 
    public bool ChargeIC { get; private set; } 
    public int StartCharge { get; private set; } 
    public int CurrentCharge { get; private set; } 
    public bool Exists { get; private set; } 

    protected internal void GetValue(byte command) 
    { 
     //Use Embedded controller to get said value 
     //ECPort.ReadEC(command); 
     //Testing Purposeses 
     Console.WriteLine(command); 
    } 
} 

Battery8800.cs

class Battery8800 : Battery<Battery8800> 
{ 
    public Battery8800() : base() 
    { 

    } 
    public void GetValue(BatteryCommands command) 
    { 
     base.GetValue((byte)command); 
    } 

    public enum BatteryCommands 
    { 
     Battery1VoltageHigh = 0x0402, 
     Battery1VoltageLow = 0x0403, 
     Batt1ChargeCurrentHigh = 0x0404, 
     Batt1ChargeCurrentLow = 0x0405, 
     Battery1MaxError = 0x0407, 
     Battery1RSOC = 0x0409, 
     Battery1FCCHigh = 0x040E, 
     Battery1FCCLow = 0x040F, 
     Battery1DCHigh = 0x0412, 
     Battery1DCLow = 0x0413, 
     Battery1Cell1High = 0x0418, 
     Battery1Cell1Low = 0x0419, 
     Battery1Cell2High = 0x041A, 
     Battery1Cell2Low = 0x041B, 
     Battery1Cell3High = 0x041C, 
     Battery1Cell3Low = 0x041D, 
     Battery1Cell4High = 0x041E, 
     Battery1Cell4Low = 0x041F, 
     PowerSource1 = 0x0420, 
//many more commands for battery 2 etc etc 
    } 
} 

BatteryInformation.cs

class BatteryInformation 
{ 
    public Battery battery1; //error says it needs 1 type of argument 
    public Battery battery2; //error says it needs 1 type of argument 
    public BatteryInformation() 
    { 

     switch (UnitModel.GetModelEnum()) 
     { 
      case UnitModel.DLIModel.DLI8300M: 
       battery1 = new Battery8300(); 
       battery2 = new Battery8300(); 
       break; 
      case UnitModel.DLIModel.DLI8400: 
       battery1 = new Battery8400(); 
       battery2 = new Battery8400(); 
       break; 
      case UnitModel.DLIModel.DLI8500: 
       battery1 = new Battery8500(); 
       break; 
      case UnitModel.DLIModel.DLI8500P: 
       battery1 = new Battery8500P(); 
       break; 
      case UnitModel.DLIModel.DLI8800: 
       battery1 = new Battery8800(); 
       break; 
      case UnitModel.DLIModel.DLI9200: 
       battery1 = new Battery9200(); 
       break; 
      default: 
       break; 
     } 
     //for testing purposes 
     battery1 = new Battery8800(); 
     battery1.DoThis(Battery8800.BatteryCommands.Batt1ChargeCurrentHigh); 
    } 
} 

YEAH !!!力はちょうど外に出て、私は緩んでいないが1文章!

私のコンピュータが再びオンになっている間、私は、バッテリーパネルのクラスでこれを行う方が良いかもしれないと思っていました。

//in my timer_tick event 
    BatteryInformation.UpdateBatteries(); 
    battery1Cell1Label.Text = BatteryInformation.Battery1.Cell1.ToString(); 
    //etc etc 

しかし、私はまだこの作業を行う必要がありますが、抽象化を行う方法を考え出すのは難しいです。あなたの時間をありがとう。私はこのことについて間違った道を進んでいると思う

EDIT

class Battery1_8400 : Battery 
{ 
    public override bool Update() 
    { 
     //TODO finish 
     Exists = GetValue((ushort)Commands.PowerSource) != 0xFF; 
     if (Exists) 
     { 
      Cell1 = GetValue((ushort)Commands.Cell1Low, (ushort)Commands.Cell1High)/1000.0f; 
      Cell2 = GetValue((ushort)Commands.Cell2Low, (ushort)Commands.Cell2High)/1000.0f; 
      Cell3 = GetValue((ushort)Commands.Cell3Low, (ushort)Commands.Cell3High)/1000.0f; 
      FCC = GetValue((ushort)Commands.FCCLow, (ushort)Commands.FCCHigh); 
      Voltage = GetValue((ushort)Commands.VoltageLow, (ushort)Commands.VoltageHigh); 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
    private enum Commands 
    { 
     PowerSource = 0x0480, 
     Charge = 0x0432, 
     RSOC = 0x0734, 
     DCLow = 0x0402, 
     DCHigh = 0x0403, 
     FCCLow = 0x0404, 
     FCCHigh = 0x0405, 
     MaxError = 0x0730, 
     Cell1Low = 0x0778, 
     Cell1High = 0x0779, 
     Cell2Low = 0x077C, 
     Cell2High = 0x077D, 
     Cell3Low = 0x0780, 
     Cell3High = 0x0781, 
     VoltageLow = 0x0438, 
     VoltageHigh = 0x0439, 
     ChargeCurrentLow = 0x0728, 
     ChargeCurrentHigh = 0x0729, 
     ChargeIC = 0x1A03, 
    } 
} 

私は9つのファイルがすべて更新コマンドがどのように動作するかという点で同じですが、違いは列挙型です。コマンドはクラスごとに若干異なります。 updateコマンドは、1つだけでなく、他の7つのファイルで同じであるbatter2_8400.csの列挙

private enum Commands 
    { 
     PowerSource = 0x0480, 
     Charge = 0x04C2, 
     RSOC = 0x0834, 
     DCLow = 0x0492, 
     DCHigh = 0x0493, 
     FCCLow = 0x0494, 
     FCCHigh = 0x0495, 
     MaxError = 0x0830, 
     Cell1Low = 0x0878, 
     Cell1High = 0x0879, 
     Cell2Low = 0x087C, 
     Cell2High = 0x087D, 
     Cell3Low = 0x0880, 
     Cell3High = 0x0881, 
     VoltageLow = 0x04C8, 
     VoltageHigh = 0x04C9, 
     ChargeCurrentLow = 0x0828, 
     ChargeCurrentHigh = 0x0829, 
     ChargeIC = 0x1A04, 
    } 

を見てください。私にはちょっとデザインが悪いようですが、どうすればいいか分かりません。ところで、私のクラスは、私が与えられた1つの答えと、受け取った数少ないコメントの後に見えるものです。

+3

汎用パラメータは何のために使用されていますか?それはあなたに必要なものがないのを私に見せます。 –

+0

はCell1がgetvalueなどを呼び出すはずですか? –

+0

@JamieDixon generic は、他の投稿からいくつかのアイデアを継承についてコピーしようとしていました。 –

答えて

0

最後に私は何をすべきかを考え出したと思います。それは私にはきれいに見え、意味があるようです。多分あなたはそれを批評することができますか?私はそれに変更を加える必要がある場合は、それを継承し、私のサブクラスで、その後

public abstract class Battery 
{ 
    public string Information { get; set; } 
    public float Cell1 { get {return GetValue(Cell1Low, Cell1High)/1000.0f;} } 
    public float Cell2 { get {return GetValue(Cell2Low, Cell2High)/1000.0f;} } 
    public float Cell3 { get {return GetValue(Cell3Low, Cell3High)/1000.0f;} } 
    public float Cell4 { get {return GetValue(Cell4Low, Cell4High)/1000.0f;} } 
    public float Voltage { get {return GetValue(VoltageLow, VoltageHigh);} } 
    public int DC { get {return GetValue(DCLow, DCHigh);} } 
    public int FCC { get {return GetValue(FCCLow, FCCHigh);} } 
    //public bool ChargeIC { get {return } } 
    //public int StartCharge { get {return } } 
    //public int CurrentCharge { get {return } } 
    public bool Exists { get {return GetValue(PowerSource) != 0xFF} } 
    public int FCCPercent { get {return ((FCC * 100)/DC);} } 

    /// <summary> 
    /// Gets a value depending on the Embedded controller 
    /// </summary> 
    /// <param name="low">The low byte command to process</param> 
    /// <param name="high">The high byte command to process</param> 
    /// <returns></returns> 
    private int GetValue(ushort low, ushort high) 
    { 
     //Use Embedded controller to get said value 
     //ECPort.ReadEC(command); 
     //Testing Purposeses 
     var lowValue = ECPort.ReadEC(low); 
     var highValue = ECPort.ReadEC(high); 
     return (int)((highValue << 8) + lowValue); 
    } 

    private int GetValue(ushort command) 
    { 
     return (int)ECPort.ReadEC(command); 
    } 

    public abstract ushort PowerSource {get;} 
    public abstract ushort Charge{get;} 
    public abstract ushort RSOC{get;} 
    public abstract ushort DCLow{get;} 
    public abstract ushort DCHigh{get;} 
    public abstract ushort FCCLow{get;} 
    public abstract ushort FCCHigh{get;} 
    public abstract ushort MaxError{get;} 
    public abstract ushort Cell1Low{get;} 
    public abstract ushort Cell1High{get;} 
    public abstract ushort Cell2Low{get;} 
    public abstract ushort Cell2High{get;} 
    public abstract ushort Cell3Low{get;} 
    public abstract ushort Cell3High{get;} 
    public abstract ushort Cell4Low { get; } 
    public abstract ushort Cell4High { get; } 
    public abstract ushort VoltageLow{get;} 
    public abstract ushort VoltageHigh{get;} 
    public abstract ushort ChargeCurrentLow{get;} 
    public abstract ushort ChargeCurrentHigh{get;} 
    public abstract ushort ChargeIC{get;} 

} 

は例では、今私は1つのファイルbattery.csを編集するだけです。この

class Battery1_8400 : Battery 
{ 
    public override ushort PowerSource { get {return 0x0480;}} 
    public override ushort Charge { get {return 0x0432;}} 
    public override ushort RSOC { get {return 0x0734;}} 
    public override ushort DCLow { get {return 0x0402;}} 
    public override ushort DCHigh { get {return 0x0403;}} 
    public override ushort FCCLow { get {return 0x0404;}} 
    public override ushort FCCHigh { get {return 0x0405;}} 
    public override ushort MaxError { get {return 0x0730;}} 
    public override ushort Cell1Low { get {return 0x0778;}} 
    public override ushort Cell1High { get {return 0x0779;}} 
    public override ushort Cell2Low { get {return 0x077C;}} 
    public override ushort Cell2High { get {return 0x077D;}} 
    public override ushort Cell3Low { get {return 0x0780;}} 
    public override ushort Cell3High { get {return 0x0781;}} 
    public override ushort VoltageLow { get {return 0x0438;}} 
    public override ushort VoltageHigh { get {return 0x0439;}} 
    public override ushort ChargeCurrentLow { get {return 0x0728;}} 
    public override ushort ChargeCurrentHigh { get {return 0x0729;}} 
    public override ushort ChargeIC { get {return 0x1A03;}} 
} 

だろう。

0

お使いのベースクラスBatteryInformationは、各値の抽象特性を有するべきであるあなたがそうのように取得する必要があります。

public abstract class BatteryInfo { 
    // int should be replaced with the actual data type of the value 
    public abstract int VoltageHigh { get; } 
    public abstract int VoltageLow { get; } 
    // etc. for each value you need 
} 

は、その後、あなたの子クラスで使用すると、さらに

public class Battery8800 : BatteryInfo { 
    public override int VoltageHigh { 
     get { 
      int value; 
      // do code to retrieve value 
      return value; 
     } 
    } 
} 

を各プロパティを実装して、私は希望次のようなUIが消費できる方法を提供してください:

public IEnumerable<BatteryInfo> GetAllBatteryInfo() { 
    // get each battery 
} 

そのようにすれば、UIは各バッテリーのバッテリー情報をどのように取得するのか心配する必要はありません。これにより、一覧またはグリッドスタイルのコントロールのいずれかを使用してバッテリ情報を表示できます。

+0

私は、情報を取得することが同じなので、異なる値をすべて上書きしないようにしたいと考えています。それはちょうど子クラスからの情報を得るためのコマンドに依存します。これはまだ正しいアプローチですか? –

+1

'GetValue'メソッドは基本クラスに実装できますが、protectedとしてマークし、子クラスのプロパティでそのメソッドを呼び出して値を取得します。 –

+0

私はこれをpublic abstract void battery.csのUpdate()にしました。その後、バッテリーを伸ばしているすべてがそれを持っていなければなりません。私はGetValue(ushort low、ushort high)を作成し、battery.csにintを返しました。次に、各サブクラスの各更新メソッドで、GetValueに値を送信して結果を保存します。これまでのところ、私はそれが動作すると思う..私はそれをテストする必要があります。 –