Реалізація серверної електронної таблиці в Visual C # (Sharp)

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

class Worksheet&ltBaseType&gt : TraderBaseClass, lWorksheet&ltBaseType&gt, IWorksheetSerialize {

BaseType[,] CellState

Func&ltIWorksheet&ltBaseType&gt, int, int, BaseType&gt[/] Cells Func&ltIWorksheet&ltBaseType&gt, int, int, BaseType&gt[] 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&ltIWorksheet&ltBaseType&gt, int, int, BaseType&gt[rows, cols] CalculationVersion = new int[rows, cols]

ColCells = new Func&ltIWorksheet&ltBaseType&gt, int, int, BaseType&gt[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&ltIWorksheet&ltBaseType&gt, int, int, BaseType&gt 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&ltIWorksheet&ltBaseType&gt, int, int, BaseType&gt cb) {

AssignCellCalculation(coordsRow, coordsColumn, cb)

}

public void AssignColCalculation(int col,

Func&ltlWorksheet&ltBaseType&gt, int, int, BaseType&gt cb) { ColCells[col] = cb

}

public BaseType GetCellState(SheetCoordinate coords) { return GetCellState(coordsRow, coordsColumn)

}

public void SetCellStatefSheetCoordinate coords, BaseType val) { SetCellState(coordsRow, coordsColumn, val)

}

public BaseType Calculate(int row, int col) {

if (CurrVersion &gt 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 &lt CellsGetLength(O) row++) { for (int col = 0 col &lt CellsGetLength(1) col++) {

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

}

}

}

}

public void CalculateRow(int row) { CurrVersion++

for (int col = 0 col &lt 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 &lt CellsGetLength(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 &lt CellsGetLength(0) row++) { bool needComma = false

if (_generateRowCounter) { needComma = true builderAppend(row)

}

for (int col = 0 col &lt CellsGetLength(1) col++) { if (needComma) {

builderAppend(&quot,&quot)

}

else {

needComma = true

}

if (CellState[row, col] = null) { builderAppend(CellState[row, col]ToStringO)

}

}

builderAppend(&quot\n&quot)

}

return builderToString()

}

}

Клас з worksheeto реалізуємо т ІНТЕРФОМ з worksheet, н о н е вказує, н а како м тип е матиме однаковий н основиватьс я лист Та до ка до реализаци я worksheeto относитс я до контей – нерном у типу, т о е ї необхідний про указат ь визначені й тип

Сповнені ї ко д реализаци і інтерфейс а iworkbook виглядай т таки м чином:

class Workbook : TraderBaseClass, IWorkbook, IEnumerable&ltstring&gt { IDictionary&ltstring, lWorksheetBase&gt _worksheets =

new Dictionary&ltstring, IWorksheetBase&gt()

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() {

„worksheetsClear()

}

public lWorksheet&ltStateType&gt GetSheet&ltStateType&gt (string identifier) { lock („worksheets) {

IWorksheet&ltStateType&gt retval = null

if („worksheetsContainsKey(identifier)) {

retval = „worksheets[identifier] as lWorksheet&ltStateType>

}

else {

retval = new Worksheet&ltStateType&gt(identifier)

„worksheetsAdd(identifier, retval)

}

return retval

}

&gt&nbsp

public iworksheetBase this[string identifier] { get {

iworksheetBase retval = null lock („worksheets) {

if („worksheetsContainsKey(identifier)) {

retval = _worksheets[identifier]

}

}

return retval

}

set {

lock (_worksheets) {

if (_worksheetsContainsKey(identifier)) {

_worksheetsRemove(identifier)

}

_worksheetsAdd(identifier, value)

}

}

}

IEnumerator&ltstring&gt IEnumerable&ltstring&gt.GetEnumerator() { foreach (string identifier in _worksheetsKeys) {

yield return identifier

}

}

IEnumerator lEnumerableGetEnumerator() {

return (((IEnumerable&ltstring&gt)this) as lEnumerable)GetEnumerator()

}

public override string ToStringO { string buffer = &quot"

foreach (string identifier in this) {  buffer += &quotWorkbook (&quot + identifier + &quot)"

}

return buffer

}

}

Клас TraderBaseclass є загальним типом object для середовища алгоритмічної торгівлі За замовчуванням всі типи є похідними типу object, що подрумевается при їх використанні У більшості додатків мається определеятся функціональність, яка потрібна для більшості класів Таку загальну функціональність я називаю базовим класом, специфічним для домену У слае з класом TraderBaseclass такої загальної функціональністю є реалація інтерфейсу iDebug

Пояснення iworksheetserialize більш складно і повязано з проблемою завантаження ек-

земпляров iworksheet без знання його типу Припустимо, що ми зберігаємо iworkbook

з кількома примірниками iworksheet, кожен певного типу Але при завантаженні будь-якого з цих примірників яким чином завантажувач знає, які маються типи Відповідь на це питання полягає в тому, що завантажувач не знає і повинен спочатку Загрей загальний тип, після чого виконати приведення до необхідному типу Вихідний код для серіалізациі можна переглянути в проекті Devspace Trader Common і пртранстве імен DevspaceTraderCommonServerSpreadsheetSerializerimpls

Джерело: Гросс К С # 2008: Пер з англ – СПб: БХВ-Петербург, 2009 – 576 е: ил – (Самовчитель)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*