1

Тема: Перевантаження індексатора

Маю задачу: Створити клас Пацієнт. Клас повинен містити інформацію про пацієнта лікарні:
●    ім’я
●    вік
●    відділення
●    список хвороб
●    лікар
●    список ліків (список структур типу Ліки (назва препарату, ціна, кількість))
●    загальна сума лікування
Методи класу:
●    Конструктор
●    Методи виводу інформації по пацієнту (дані про пацієнта, список ліків, список хвороб)
●    Публічні властивості на поля класу та індексатор для роботи зі списками

Ось структура та клас (без методів виведення інформації)

Прихований текст
struct Medicament
{
    public string name;
    public double price;
    public int quantity;
}

class Patient
{
    string name;
    int age;
    string ward;
    List<string> diseases;
    string doctor_name;
    List<Medicament> medicaments;
    double total_sum_treatment;

    public Patient()
    {
        name = "no name";
        age = 0;
        ward = "no ward";
        diseases = new List<string> ();
        doctor_name = "no doctor";
        medicaments = new List<Medicament> ();
        total_sum_treatment = 0;
    }

    public Patient(string _name, int _age, string _ward, string disease, string doctor, Medicament medicament)
    {
        name = _name;
        age = _age;
        ward = _ward;

        diseases = new List<string>();
        diseases.Add (disease);

        doctor_name = doctor;

        medicaments = new List<Medicament>();
        medicaments.Add (medicament);

        foreach (Medicament drug in medicaments)
            total_sum_treatment += drug.price * drug.quantity;
    }

    //public properties for fields
    public string Name
    {
        get { return name; }
        set { if (value != "") name = value; }
    }

    public int Age
    {
        get { return age; }
        set { if (value > 0) age = value; }
    }

    public string Ward
    {
        get { return ward; }
        set { if (value != "") ward = value; }
    }

    public string Doctor
    {
        get { return doctor_name; }
        set { if (value != "") doctor_name = value; }
    }

    public List<string> Diseases
    {
        get { return diseases; }
    }

    public List<Medicament> Medicaments
    {
        get { return medicaments; }
    }

    public double TotalSumTreatment
    {
        get { return total_sum_treatment; }
    }
}

І, власне, сама проблема: у завданні є пункт про створення індексації для роботи зі списками. Як можна зробити індексацію для двох списків одночасно?
Ось те, що я намагалась зробити (розумію, що це є неправильно, але уявлення не маю як правильно це реалізувати):

Прихований текст
public string this[int key]
{
    get
    {
        if (key < 0 || key >= diseases.Count)
            return String.Format("Index can't be < {0} and >{1}", 0, diseases.Count);
        else
            return diseases[key];
    }
    set
    {
        if (key < 0 || key >= diseases.Count)
            Console.WriteLine("Index can't be < {0} and >{1}", 0, diseases.Count);
        else
            diseases[key] = value;
    }
}

public Medicament this[int key]
{
    get
    {
        if (key < 0 || key >= medicaments.Count)
            return String.Format("Index can't be < {0} and >{1}", 0, medicaments.Count);
        else
            return medicaments[key];
    }
    set
    {
        if (key < 0 || key >= medicaments.Count)
            Console.WriteLine("Index can't be < {0} and >{1}", 0, medicaments.Count);
        else
            medicaments[key] = value;
    }
}

Підкажіть, будь ласка.

2

Re: Перевантаження індексатора

Щось тут не так. Можливо, некоректно поставлена задача. Наскільки Я розумію "індексатори" в будь-якій (або майже будь-якій) мові програмування - це доступ по індексу до екземпляру класу. Тобто у даному випадку щось типу:

p = Patient();
Console.WriteLine("Patient number 1: {0}", p[1]);

Ну і коли перевизначати свій метод, то можна підпихнути будь-що. А там є 2 ліста, ну то фіг його знає, вертати значення обох по одному індексу? Бо самі вони вже ж мають індекси, лісти як не як.

Подякували: pika19891

3

Re: Перевантаження індексатора

Вам мабуть щось таке потрібно. Воно зовсім сире, але на його основі можна продовжувати.
Завантажте, скомпілюйте.

Post's attachments

Patient.zip 11.32 kb, 450 downloads since 2016-07-25 

Подякували: pika19891

4

Re: Перевантаження індексатора

Я все-таки вирішила запитати у викладача як виконати цю індексацію, і ось результат:

Прихований текст
public string this[int key]
{
    get
    {
        if (key < 0 || key >= diseases.Count)
            return String.Format("Index can't be < {0} and >{1}", 0, diseases.Count);
        else
            return diseases[key];
    }
    set
    {
        if (key < 0 || key >= diseases.Count)
            Console.WriteLine("Index can't be < {0} and >{1}", 0, diseases.Count);
        else
            diseases[key] = value;
    }
}

public Medicament this[string name]
{
    get
    {
        int i = 0;
        while (i < medicaments.Count && medicaments[i].name != name)
            ++i;
        if (i < medicaments.Count)
            return medicaments[i];
        return new Medicament();
    }
    set
    {
        int i = 0;
        while (i < medicaments.Count && medicaments[i].name != name)
            ++i;
        if (i < medicaments.Count)
            medicaments[i] = value;
    }
}

Тобто, для того щоб встановити індексацію для двох списків у класі, необхідно щоб був різний тип індексів. Якось так)

Подякували: FakiNyan, leofun01, Master_Sergius3

5

Re: Перевантаження індексатора

pika1989 написав:

Я все-таки вирішила запитати у викладача як виконати цю індексацію, і ось результат:
Тобто, для того щоб встановити індексацію для двох списків у класі, необхідно щоб був різний тип індексів. Якось так)

Ну то це дійсно паршива архітектура (не дуже коректно поставлена задача). Але хай буде, це ж просто навчання.

Подякували: leofun011

6 Востаннє редагувалося DOP (26.07.2016 13:39:53)

Re: Перевантаження індексатора

pika1989 написав:

Я все-таки вирішила запитати у викладача як виконати цю індексацію, і ось результат:

Прихований текст
public string this[int key]
{
    get
    {
        if (key < 0 || key >= diseases.Count)
            return String.Format("Index can't be < {0} and >{1}", 0, diseases.Count);
        else
            return diseases[key];
    }
    set
    {
        if (key < 0 || key >= diseases.Count)
            Console.WriteLine("Index can't be < {0} and >{1}", 0, diseases.Count);
        else
            diseases[key] = value;
    }
}

public Medicament this[string name]
{
    get
    {
        int i = 0;
        while (i < medicaments.Count && medicaments[i].name != name)
            ++i;
        if (i < medicaments.Count)
            return medicaments[i];
        return new Medicament();
    }
    set
    {
        int i = 0;
        while (i < medicaments.Count && medicaments[i].name != name)
            ++i;
        if (i < medicaments.Count)
            medicaments[i] = value;
    }
}

Тобто, для того щоб встановити індексацію для двох списків у класі, необхідно щоб був різний тип індексів. Якось так)

Раджу на майбутнє: генеруйте помилки в індексаторі(як варіант, передаючи опис в конструктор - throw new System.IndexOutOfRangeException('Message')), а не повертайте код помилки, як результат роботи індексатора!

Подякували: leofun01, pika19892