Как использовать переменную

245
26 апреля 2018, 08:04

У меня в главном классе создан метод virtual, в классах наследниках, он переопределяется. Так вот, мне нужно из классов наследников взять значение переменных, которые находятся в методе override. Я создаю объекты классов наследников, но мне нужно ввести аргументы и тут я не знаю что делать. Вот весь код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using help3;
namespace help3
{
    public class Katalog
    {
        public string Type { get; set; }
        public string Model { get; set; }
        public string Firm { get; set; }
        public string Diagonal { get; set; }
        public int Tv_tuner { get; set; }
        public string Resolution { get; set; }
        public string Type_matrix { get; set; }
        public string Type_sensor { get; set; } //Sensor
        public string Amount_hdd { get; set; } //Sensor
        public virtual int Price()
        {
            int value = 0;
            return value;
        }
    }
        public class LCD : Katalog
        {
            public int value { get; set; }
            public LCD(string Type, string Model, string Firm, string Diagonal, int Tv_Tuner, string Resolution, string Type_matrix, int value)
            {
                this.Type = Type;
                this.Model = Model;
                this.Firm = Firm;
                this.Diagonal = Diagonal;
                this.Tv_tuner = Tv_tuner;
                this.Resolution = Resolution;
                this.Type_matrix = Type_matrix;
                this.value = value;
            }
            public LCD(string l)
            {
                string[] split = l.Split(new Char[] { '*' });
                Model = split[0].Trim();
                Firm = split[1].Trim();
                Diagonal = split[2].Trim();
                Tv_tuner = int.Parse(split[3].Trim());
                Resolution = split[4].Trim();
                Type_matrix = split[5].Trim();
                value = int.Parse(split[6].Trim());
            }
        public override string ToString()
            {
                return String.Format("Модель {0}\nФирма {1}\nДиагональ {2}\nРазрешение {3}\nТип матрицы {4}\nСтоимость {5} гривны\n", Model, Firm, Diagonal, Resolution, Type_matrix, value);
            }
            public override int Price()
            {
                    value = (value + Tv_tuner) - (value * 5 / 100);
                    return value;
            }
    }
        public class Sensor : Katalog
        {
        public Sensor(string Type, string Model, string Firm, string Diagonal, int Tv_Tuner, string Resolution, string Type_sensor, string Amount_hdd)
        {
            this.Type = Type;
            this.Model = Model;
            this.Firm = Firm;
            this.Diagonal = Diagonal;
            this.Resolution = Resolution;
            this.Type_sensor = Type_sensor;
            this.Amount_hdd = Amount_hdd;
        }
        public int value { get; set; }
        public Sensor(string l)
        {
            string[] split = l.Split(new Char[] { '*' });
            Model = split[0].Trim();
            Firm = split[1].Trim();
            Diagonal = split[2].Trim();
            Resolution = split[3].Trim();
            Type_sensor = split[4].Trim();
            Amount_hdd = split[5].Trim();
            value = int.Parse(split[6].Trim());
        }
        public override string ToString()
        {
            return String.Format("Модель {0}\nФирма {1}\nДиагональ {2}\nРазрешение {3}\nOбъем HDD {4}\nТип сенсора {5}\nСтоимость {6} гривны\n", Model, Firm, Diagonal, Resolution, Amount_hdd, Type_sensor, value);
        }
        public override int Price()
        {
                value = ((value * 3 / 100) * 12 + value) / 12;
                return value;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            void CreateList()
            {
                StreamReader file = new StreamReader("Katalog.txt");
                List<LCD> Katalog_LCD = new List<LCD>();
                List<Sensor> Katalog_Sensor = new List<Sensor>();
                string line;
                while ((line = file.ReadLine()) != null)
                {
                    if (line.EndsWith("*"))
                    { Katalog_LCD.Add(new LCD(line)); }
                    else
                    { Katalog_Sensor.Add(new Sensor(line)); }
                }
                foreach (LCD a in Katalog_LCD)
                {
                    Console.WriteLine(a);
                }
                foreach (Sensor b in Katalog_Sensor)
                {
                    Console.WriteLine(b);
                }
            }
            CreateList();

            //Программа
                LCD L = new LCD();
                Sensor S = new Sensor();
                Console.WriteLine("Какой монитор вы желаете приобрести 1.LCD или 2.Сенсорный?");
                string buy;
                while (true)//Цикл для правильного ввода названия мониторов
                {
                    buy = Console.ReadLine();
                    if (buy == "1" || buy == "2") break;
                    else Console.WriteLine("Пожалуйста введите правильное название");
                }
                switch (buy)
                {
                    case "1":
                        Console.WriteLine("Желаете приопрести ТВ-тюнер всего за 299 гривен и получить скидку 5% на всю сумму покупки?");
                        string tv_tuner = Console.ReadLine();
                        if (tv_tuner == "+")
                        {
                            L.Price();
                            Console.WriteLine("Вы купили LCD монитор и ТВ-тюнер.\nСумма к оплате сo скидкой 5% {0} гривен.", L.value);
                        }
                        else if (tv_tuner == "-")
                        {
                            Console.WriteLine("Вы купили LCD монитор.\nСумма к оплате {0} гривен.", L.value);
                        }
                        break;
                    case "2":
                        Console.WriteLine("Желаете взять кредит на 12 месяцев?");
                        string kredit = Console.ReadLine();
                        if (kredit == "+")
                        {
                            Console.WriteLine("Вы взяли кредит, суммой {0} гривен, на 12 месяцев, под 3%.", S.value);
                            S.Price();
                            Console.WriteLine("Ежемесячная сумма погашения кредита, составляет {0} гривен.", S.value);
                        }
                        else if (kredit == "-")
                        {
                            Console.WriteLine("Вы купили сенсорный монитор. Сумма к оплате {0} гривен.", S.value);
                        }
                        break;
                }
            Console.ReadLine();
        }
    }
}

Answer 1

Итак, у вас есть класс родитель

public class Katalog
{
    public string Type { get; set; }
    public string Model { get; set; }
    public string Firm { get; set; }
    public string Diagonal { get; set; }
    public int Tv_tuner { get; set; }
    public string Resolution { get; set; }
    public string Type_matrix { get; set; }
    public string Type_sensor { get; set; } //Sensor
    public string Amount_hdd { get; set; } //Sensor
    public virtual int Price()
    {
        int value = 0;
        return value;
    }
}

И класс наследник(упростил, чтобы не загромождать)

public class LCD : Katalog
{
    public int Value { get; set; }
    public LCD()
    {
        Type = "*НЕ ЗАДАНО*";
        Model = "*НЕ ЗАДАНО*";
        Firm = "*НЕ ЗАДАНО*";
        Diagonal = "*НЕ ЗАДАНО*";
        Tv_tuner = 0;
        Resolution = "*НЕ ЗАДАНО*";
        Type_matrix = "*НЕ ЗАДАНО*";
        Value = 0;
    }
    public LCD(string Type, string Model, string Firm, string Diagonal, int Tv_Tuner, string Resolution, string Type_matrix, int value)
    {
        this.Type = Type;
        this.Model = Model;
        this.Firm = Firm;
        this.Diagonal = Diagonal;
        this.Tv_tuner = Tv_Tuner;
        this.Resolution = Resolution;
        this.Type_matrix = Type_matrix;
        this.Value = value;
    }
    public override int Price()
    {
        Value = (Value + Tv_tuner) - (Value * 5 / 100);
        return Value;
    }
 }

В классе наследнике есть конструктор, не принимающий значения:

public LCD()
{
    Type = "*НЕ ЗАДАНО*";
    Model = "*НЕ ЗАДАНО*";
    Firm = "*НЕ ЗАДАНО*";
    Diagonal = "*НЕ ЗАДАНО*";
    Tv_tuner = 0;
    Resolution = "*НЕ ЗАДАНО*";
    Type_matrix = "*НЕ ЗАДАНО*";
    Value = 0;
}

И конструктор, принимающий значения(идёт следом). Далее, создаём экземпляры класса:

static void Main(string[] args)
{
    LCD lcd1 = new LCD();
    LCD lcd2 = new LCD("qwe","dwdwd","zxcc","dwdwdwdwddddd", 50,"ddgrgrh","dwdbkuk",300);
    Console.WriteLine(lcd1.Price());
    Console.WriteLine(lcd2.Price());
    Console.ReadKey();
}

Экземпляр lcd1 использует конструктор без параметров, в то время как lcd2 конструктор с параметрами.

Answer 2

Если отвечать в контексте вашего вопроса, то вам нужно создавать свои объекты:

LCD L = new LCD();
Sensor S = new Sensor();

В соответствии с их конструкторами. Либо создать для них конструктора без параметров. С установкой в конструкторах каких-то значений по умолчанию.

Мне так-же не понятен смысл функции createList. Вы получаете два списка устройств из файла, но нигде не используете его. Если вы хотите использовать эти списки ниже в коде, то надо организовывать цикл, а лучше итератор. И вообще, свести устройства в один список List<Catalog> Katalog = new List<Catalog>();, используя полиморфизм, а затем определяя тип устройства через is. К слову, если использовать один объект, а не два, у Вас получится уйти от switch, предварительно инкапсулируя сообщения на консоль в методы класса.

С другой стороны, ваша архитектура ужасна. Используемое вами наследование порочно в данном случае. Я бы использовал скорее паттерн фасад, если конечно мне удалось понять что вы хотели получить. Этот паттерн доступно описан в паттернах проектирования Эрика фримена.

Также можно попробовать вынести отличия двух классов в один общий и агрегировать абстракцию. Это тоже сможет очень помочь.

Answer 3

Использовать переменную можно так: Взять тело метода createList и вставил его в метод Main, а сам метод createList удалить. В методе Main уже использовать переменные и методы класса. Katalog_LCD[индекс].Price() - запуск метода. Katalog_LCD[индекс].value - использование переменной.

Ну и вот полностью код, может кому поможет:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using help3;
namespace help3
{
    public class Katalog
    {
        public string Type { get; set; }
        public string Model { get; set; }
        public string Firm { get; set; }
        public string Diagonal { get; set; }
        public int Tv_tuner { get; set; }
        public string Resolution { get; set; }
        public string Type_matrix { get; set; }
        public string Type_sensor { get; set; } //Sensor
        public string Amount_hdd { get; set; } //Sensor
        public virtual int Price()
        {
            int value = 0;
            return value;
        }
    }
        public class LCD : Katalog
        {
            public int value { get; set; }
            public LCD(string Type, string Model, string Firm, string Diagonal, int Tv_Tuner, string Resolution, string Type_matrix, int value)
            {
                this.Type = Type;
                this.Model = Model;
                this.Firm = Firm;
                this.Diagonal = Diagonal;
                this.Tv_tuner = Tv_tuner;
                this.Resolution = Resolution;
                this.Type_matrix = Type_matrix;
                this.value = value;
            }
            public LCD(string l)
            {
                string[] split = l.Split(new Char[] { '*' });
                Model = split[0].Trim();
                Firm = split[1].Trim();
                Diagonal = split[2].Trim();
                Tv_tuner = int.Parse(split[3].Trim());
                Resolution = split[4].Trim();
                Type_matrix = split[5].Trim();
                value = int.Parse(split[6].Trim());
            }
        public LCD()
        {
        }
        public override string ToString()
            {
                return String.Format("Модель {0}\nФирма {1}\nДиагональ {2}\nРазрешение {3}\nТип матрицы {4}\nСтоимость {5} гривны\n", Model, Firm, Diagonal, Resolution, Type_matrix, value);
            }
            public override int Price()
            {
                    value = (value + Tv_tuner) - (value * 5 / 100);
                    return value;
            }
    }
        public class Sensor : Katalog
        {
        public int value { get; set; }

        public Sensor(string l)
        {
            string[] split = l.Split(new Char[] { '*' });
            Model = split[0].Trim();
            Firm = split[1].Trim();
            Diagonal = split[2].Trim();
            Resolution = split[3].Trim();
            Type_sensor = split[4].Trim();
            Amount_hdd = split[5].Trim();
            value = int.Parse(split[6].Trim());
        }

        public Sensor()
        {
        }
        public override string ToString()
        {
            return String.Format("Модель {0}\nФирма {1}\nДиагональ {2}\nРазрешение {3}\nOбъем HDD {4}\nТип сенсора {5}\nСтоимость {6} гривны\n", Model, Firm, Diagonal, Resolution, Amount_hdd, Type_sensor, value);
        }
        public override int Price()
        {
                value = ((value * 3 / 100) * 12 + value) / 12;
                return value;
        }
        public Sensor(string Type, string Model, string Firm, string Diagonal, int Tv_Tuner, string Resolution, string Type_sensor, string Amount_hdd, int value)
        {
            this.Type = Type;
            this.Model = Model;
            this.Firm = Firm;
            this.Diagonal = Diagonal;
            this.Resolution = Resolution;
            this.Type_sensor = Type_sensor;
            this.Amount_hdd = Amount_hdd;
            this.value = value;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            StreamReader file = new StreamReader("Katalog.txt");
            List<LCD> Katalog_LCD = new List<LCD>();
            List<Sensor> Katalog_Sensor = new List<Sensor>();
            string line;
            while ((line = file.ReadLine()) != null)
            {
                if (line.EndsWith("*"))
                { Katalog_LCD.Add(new LCD(line)); }
                else
                { Katalog_Sensor.Add(new Sensor(line)); }
            }
            foreach (LCD a in Katalog_LCD)
            {
                Console.WriteLine("---LCD монитор---\n{0}", a);//Вывод ЛСД
            }
            foreach (Sensor b in Katalog_Sensor) 
            {
                Console.WriteLine("---Сенсорный монитор---\n{0}", b);//Вывод Сенсоров
            }
            m:
            string Type;
            while (true)//Цикл для правильного ввода названия мониторов
            {
                Console.WriteLine("Какой тип монитора Вы хотите купить, LCD или Sensor ");
                Type = Console.ReadLine();
                if (Type == "LCD" || Type == "Sensor") break;
                else Console.WriteLine("Пожалуйста, введите правильный тип");
            }
            Console.WriteLine("Теперь модель монитора");
            string Model = Console.ReadLine();
                if (Type == "LCD")
                {
                    var test = from i in Katalog_LCD
                               where i.Model == Model
                               select i;
                    foreach (LCD i in test)
                    {
                        Console.WriteLine("\nВы выбрали этот монитор: \n{0}", i);
                        Console.WriteLine("При покупке LCD монитора с tv-тюнером, стоимостью более 5000 гривен, предоставляется скидка 5%\nСтоимость tv-тюнерa {0} гривен\nЖелатете купить tv-тюнер?", i.Tv_tuner);
                        string tv_tuner = Console.ReadLine();
                        if (tv_tuner == "+")
                        {
                            if (i.value > 5000)
                            {
                                i.Price();
                                Console.WriteLine("Вы купили LCD монитор и ТВ-тюнер.\nСумма к оплате сo скидкой {0} гривен.", i.value);
                            }
                            else
                            {
                                Console.WriteLine("Сумма Вашей покупки не достаточна для данyой акции.");
                            }
                        }
                        else if (tv_tuner == "-" && tv_tuner == "+")
                        {
                            Console.WriteLine("Вы купили LCD монитор.\nСумма к оплате {0} гривен.", i.value);
                        }
                    }
                }
                else if (Type == "Sensor")
                {
                    var test = from i in Katalog_Sensor
                               where i.Model == Model
                               select i;
                    foreach (Sensor i in test)
                    {
                        Console.WriteLine("Вы выбрали этот монитор: \n{0}", i);
                        Console.WriteLine("Желаете взять кредит на 12 месяцев?");
                        string kredit = Console.ReadLine();
                        if (kredit == "+")
                        {
                            Console.WriteLine("Вы взяли кредит, суммой {0} гривен, на 12 месяцев, под 3%.", i.value);
                            i.Price();
                            Console.WriteLine("Ежемесячная сумма погашения кредита, составляет {0} гривен.", i.value);
                        }
                        else if (kredit == "-")
                        {
                            Console.WriteLine("Вы купили сенсорный монитор. Сумма к оплате {0} гривен.", i.value);
                        }
                    }
                }
            Console.WriteLine("Приходите к нам ещё.");
            string start = Console.ReadLine();
            if (start != null)
            goto m;
            Console.ReadLine();
        }
    }
}
READ ALSO
Как привязать цвет эллипса к полю объекта?

Как привязать цвет эллипса к полю объекта?

Пытаюсь привязать цвет эллипса к полю созданного класса, но ничего не выходитЧто я делаю не так? Xaml:

207
Алфавитный алгоритм

Алфавитный алгоритм

Требуется из цифры 1 получить A, из 2 получить B, из 3 получить C и тд до ZКак это сделать?

194
Отлов события изменения ObservableCollection

Отлов события изменения ObservableCollection

Есть приложение в котором пользователь может указывать название продукта и его цену, по нажатию на кнопку эти данные вносятся в ObservableCollection...

178