Главная » C# » Реализация серверной электронной таблицы в Visual C# (Sharp)

0

Теперь посмотрим, как реализуются книга и лист. Далее приводится полный код реализации  интерфейса  worksheet:

class Worksheet<BaseType> : TraderBaseClass, lWorksheet<BaseType>, IWorksheetSerialize {

BaseType[,] CellState;

Func<IWorksheet<BaseType>, int, int, BaseType>[/] Cells; Func<IWorksheet<BaseType>, int, int, BaseType>[] ColCells; int[,] CalculationVersion;

int CurrVersion; int _maxRows; int _maxCols;

string _identifier; public Worksheet() {

}

public Worksheet(string identifier) {

_identifier = identifier;

}

public void Dimension(int rows, int cols) { CellState = new BaseType[rows, cols];

Cells = new Func<IWorksheet<BaseType>, int, int, BaseType>[rows, cols]; CalculationVersion = new int[rows, cols];

ColCells = new Func<IWorksheet<BaseType>, int, int, BaseType>[cols]; CurrVersion = 0;

_maxRows = rows;

_maxCols = cols;

}

public int MaxRows { get {

return _maxRows;

}

}

public int MaxCols { get {

return _maxCols;

}

}

public BaseType[,] Data { get {

return CellState;

}

}

public void AssignCellState(int row, int col, object value) { CellState[row, col] = (BaseType)value;

}

public void AssignCellCalculation(int row, int col, Func<IWorksheet<BaseType>, int, int, BaseType> cb) {

Cells[row, col] = cb;

}

public BaseType GetCellState(int row, int col) { return CellState[row, col];

}

public void SetCellState(int row, int col, BaseType val) { CellState[row, col] = val;

Cells[row, col] = null;

}

public void AssignCellCalculation(SheetCoordinate coords, Func<IWorksheet<BaseType>, int, int, BaseType> cb) {

AssignCellCalculation(coords.Row, coords.Column, cb) ;

}

public void AssignColCalculation(int col,

Func<lWorksheet<BaseType>, int, int, BaseType> cb) { ColCells[col] = cb;

}

public BaseType GetCellState(SheetCoordinate coords) { return GetCellState(coords.Row, coords.Column);

}

public void SetCellStatefSheetCoordinate coords, BaseType val) { SetCellState(coords.Row, coords.Column, val);

}

public BaseType Calculate(int row, int col) {

if (CurrVersion > CalculationVersion[row, col]) { CellState[row, col] = Cells[row, col](this, row, col); CalculationVersion[row, col] = CurrVersion;

}

return CellState[row, col];

}

public BaseType Calculate(SheetCoordinate coords) { return Calculate (coords .Row, coords .Column) ,-

}

public void Calculate() { CurrVersion++;

for (int row = 0; row < Cells.GetLength(O); row++) { for (int col = 0; col < Cells.GetLength(1); col++) {

if (Cells[row, col] != null) { Calculate(row, col);

}

}

}

}

public void CalculateRow(int row) { CurrVersion++;

for (int col = 0; col < Cells .GetLength(1) col++) { if (Cells[row, col] ! = null) {

Calculate(row, col);

}

}

}

public void CalculateCol(int col) { CurrVersion++;

if (ColCells[col] == null) { return;

}

for (int row = 0; row < Cells.GetLength(0); row++) { CellState[row, col] = ColCells[col](this, row, col);

}

}

bool _generateRowCounter;

public bool GenerateRowCounter { get {

return _generateRowCounter;

set {

_generateRowCounter = value;

}

}

public override string ToStringO { StringBuilder builder = new StringBuilder();

for (int row = 0; row < Cells.GetLength(0); row++) { bool needComma = false;

if (_generateRowCounter) { needComma = true; builder.Append(row);

}

for (int col = 0; col < Cells.GetLength(1); col++) { if (needComma) {

builder.Append(",");

}

else {

needComma = true;

}

if (CellState[row, col] != null) { builder.Append(CellState[row, col].ToStringO);

}

}

builder.Append("\n");

}

return builder.ToString();

}

}

Клас с worksheeto реализуе т интерфей с worksheet, н о н е указывает , н а како м тип е долже н основыватьс я лист . Та к ка к реализаци я  worksheeto относитс я  к  контей – нерном у  типу ,  т о  е й  необходим о  указат ь  определенны й  тип .

Полны й  ко д  реализаци и  интерфейс а  iworkbook выгляди т  таки м  образом :

class Workbook : TraderBaseClass, IWorkbook, IEnumerable<string> { IDictionary<string, lWorksheetBase> _worksheets =

new Dictionary<string, IWorksheetBase>();

string _identifier;  public string Identifier {

get {

return „identifier;

}

}

bool _generateRowCounter;

publ ic bool GeneDTSteRowCounteDT { get {

return „generateRowCounter;

}

set {

„generateRowCounter = value;

}

}

public Workbook(string identifier) {

„identifier = identifier;

}

public void Clear() {

„worksheets.Clear();

}

public lWorksheet<StateType> GetSheet<StateType> (string identifier) { lock („worksheets) {

IWorksheet<StateType> retval = null;

if („worksheets.ContainsKey(identifier)) {

retval = „worksheets[identifier] as lWorksheet<StateType>;

}

else {

retval = new Worksheet<StateType>(identifier);

„worksheets.Add(identifier, retval);

}

return retval;

}

public iworksheetBase this[string identifier] { get {

iworksheetBase retval = null; lock („worksheets) {

if („worksheets.ContainsKey(identifier)) {

retval = _worksheets[identifier];

}

}

return retval;

}

set {

lock (_worksheets) {

if (_worksheets.ContainsKey(identifier)) {

_worksheets.Remove(identifier);

}

_worksheets.Add(identifier, value);

}

}

}

IEnumerator<string> IEnumerable<string>.GetEnumerator() { foreach (string identifier in _worksheets.Keys) {

yield return identifier;

}

}

IEnumerator lEnumerable.GetEnumerator() {

return (((IEnumerable<string>)this) as lEnumerable).GetEnumerator();

}

public override string ToStringO { string buffer = "";

foreach (string identifier in this) {  buffer += "Workbook (" + identifier + ")";

}

return buffer;

}

}

Класс TraderBaseclass является общим типом object для среды алгоритмической торговли. По умолчанию все типы являются производными типа object , что подрумевается при их использовании. В большинстве приложений имеется определеая функциональность, которая требуется для большинства классов. Такую общую функциональность я называю базовым классом, специфичным для домена. В слае с классом TraderBaseclass такой общей функциональностью является реалация интерфейса iDebug.

Объяснение iworksheetserialize более сложно и связано с проблемой загрузки эк-

земпляра  iworksheet без  знания  его типа.  Допустим,  что  мы  сохраняем  iworkbook

с несколькими экземплярами iworksheet, каждый определенного типа. Но при загрузке какого-либо из этих экземпляров каким образом загрузчик знает, какие имеются типы? Ответ на этот вопрос заключается в том, что загрузчик не знает и должен сначала загрить общий тип, после чего выполнить приведение к требуемому типу. Исходный код для сериализации можно просмотреть в проекте Devspace. Trader .common и пртранстве имен Devspace.Trader.Common.ServerSpreadsheet.Serializerimpls.

Источник: Гросс  К. С# 2008:  Пер. с англ. — СПб.:  БХВ-Петербург, 2009. — 576 е.:  ил. — (Самоучитель)

По теме:

  • Комментарии