ztp zadanie 1

mail@pastecode.io avatar
unknown
plain_text
2 years ago
6.9 kB
17
Indexable
Never
Zmodyfikuj dany zaczątek programu tak, aby można było wybrać typ kolumny (np. int, double, real, bool, string). Wykorzystaj w tym celu wzorzec Abstract Factory.
Dodaj kolejne klasy implementujące interfejs TableData
Zastąp klasę TableHeader hierarchią równoległą do hierarchii TableData (dla każdego możliwego typu danych będzie istniał odpowiedni typ nagłówka, użytkownik klasy Table o typie kolumny będzie decydował przekazując nagłówek odpowiedniego typu do metody addRow()).
W hierarchii TableHeader dodaj metodę generującą dane właściwego typu.
Wykorzystaj tę metodę w addRow i addCol klasy Table, aby dodawać komórki odpowiedniego typu (zastąp wywołanie new TableDataInt()).



using System;
using System.Collections.Generic;
using System.Text;

namespace ZTP01
{
    class Program
    {
        static void Main(string[] args)
        {
            Table table = new Table();
            table.addCol(new IntColumnFactory());
            table.addCol(new DoubleColumnFactory());
            table.addCol(new StringColumnFactory());

            table.addRow();
            table.addRow();
            table.addRow();
            table.addRow();
            table.addRow();
            Console.WriteLine(table);


            table.addCol(new BoolColumnFactory());
            table.addRow();
            table.addRow();
            Console.WriteLine(table);
        }
    }

    abstract class ColumnFactory
    {
        public abstract TableHeaderBase CreateHeader();
        public abstract TableData CreateData();
    }

    class IntColumnFactory : ColumnFactory
    {
        public override TableHeaderBase CreateHeader()
        {
            return new IntHeader();
        }

        public override TableData CreateData()
        {
            return new TableDataInt();
        }
    }

    class DoubleColumnFactory : ColumnFactory
    {
        public override TableHeaderBase CreateHeader()
        {
            return new DoubleHeader();
        }

        public override TableData CreateData()
        {
            return new TableDataDouble();
        }
    }

    class StringColumnFactory : ColumnFactory
    {
        public override TableHeaderBase CreateHeader()
        {
            return new StringHeader();
        }
  
        public override TableData CreateData()
        {
            return new TableDataString();
        }
    }

    class BoolColumnFactory : ColumnFactory
    {
        public override TableHeaderBase CreateHeader()
        {
            return new BoolHeader();
        }

        public override TableData CreateData()
        {
            return new TableDataBool();
        }
    }

    abstract class TableHeaderBase
    {
    public abstract TableData CreateData();
    public abstract TableData GenerateData();
    public abstract string Name { get; }
    }


    class IntHeader : TableHeaderBase
{
    public override TableData CreateData()
    {
        return new TableDataInt();
    }

    public override TableData GenerateData()
    {
        return new TableDataInt();
    }

    public override string Name => "Int Column";
}


    class DoubleHeader : TableHeaderBase
    {
        public override TableData CreateData()
        {
            return new TableDataDouble();
        }

        public override string Name => "Double Column";
    }

    class StringHeader : TableHeaderBase
    {
        public override TableData CreateData()
        {
            return new TableDataString();
        }

        public override string Name => "String Column";
    }

    class BoolHeader : TableHeaderBase
    {
        public override TableData CreateData()
        {
            return new TableDataBool();
        }

        public override string Name => "Bool Column";
    }

    class Table
    {
        // lista nagłówków
        private List<TableHeaderBase> headers;
        // lista wierszy (każdy wiersz to lista komórek)
        private List<List<TableData>> rows;

        public Table()
        {
            headers = new List<TableHeaderBase>();
            rows = new List<List<TableData>>();
        }
        // dodawanie wiersza
        public void addRow()
        {
            // nowy wiersz
            List<TableData> row = new List<TableData>();
            // wypełniamy komórkami - tyle, ile mamy kolumn
            foreach (TableHeaderBase col in headers)
                row.Add(col.GenerateData());
            // dodajemy do listy wierszy
            rows.Add(row);
        }
        // dodawanie kolumny
        public void addCol(ColumnFactory factory)
        {
        // dodajemy do listy nagłówków
        TableHeaderBase header = factory.CreateHeader();
        headers.Add(header);
        // dodajemy po jednej komórce do każdego wiersza
        foreach (List<TableData> row in rows)
        row.Add(header.GenerateData());
        }
        // do wypisywania tabeli
        public override string ToString()
        {
            StringBuilder result = new StringBuilder();
            result.Append("| ");
            result.AppendJoin(" | ", headers);
            result.AppendLine(" |");

            result.Insert(result.Length, "+----", headers.Count);
            result.AppendLine("+");

            foreach (List<TableData> row in rows)
            {

                result.Append("| ");
                result.AppendJoin(" | ", row);
                result.AppendLine(" |");
            }

            return result.ToString();
        }
    }

    abstract class TableData
    {
        public abstract string ToString();
    }

    class TableDataInt : TableData
    {
        private int value;

        public TableDataInt()
        {
            value = 0;
        }

        public override string ToString()
        {
            return value.ToString();
        }
    }

    class TableDataDouble : TableData
    {
        private double value;

        public TableDataDouble()
        {
            value = 0.0;
        }

        public override string ToString()
        {
            return value.ToString();
        }
    }

    class TableDataString : TableData
    {
        private string value;

        public TableDataString()
        {
            value = "";
        }

        public override string ToString()
        {
            return value;
        }
    }

    class TableDataBool : TableData
    {
        private bool value;

        public TableDataBool()
        {
            value = false;
        }

        public override string ToString()
        {
            return value.ToString();
        }
    }
}