私はこれを間違っていると感じています。私はクラスを抽象化するのが初めてで、チュートリアルを少し読んでいますが、私の状況にそれを適用する方法を理解することはできません。私のデザインは間違っているかもしれないと思いますが、私はそれをやるための別の方法を考えることはできません。私の会社はいくつかの異なるコンピュータを作っているので、バッテリーの情報を監視する必要があります。情報を得ることは問題ではありませんが、基本クラスにさまざまなコマンドを送信して、必要な処理を実行する方法を考え出します。セル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つの答えと、受け取った数少ないコメントの後に見えるものです。
汎用パラメータは何のために使用されていますか?それはあなたに必要なものがないのを私に見せます。 –
はCell1がgetvalueなどを呼び出すはずですか? –
@JamieDixon genericは、他の投稿からいくつかのアイデアを継承についてコピーしようとしていました。 –