Присвоение класса в ветвлении

energy75
Дата: 06.09.2018 11:50:59
Добрый день всем.


Прошу натолкнуть на мысль, как профессионалы реализовывают следующую задачу:

Есть несколько классов. Методы и свойства в классах абсолютно одинаково именованы, и возвращают аналогичные (типизированные) значения. Реализация методов в классах очень разнится, поэтому это не один класс, а множество классов.

Есть процедура, в которой в зависимости от входных условий необходимо в операторе ветвления объявить переменную выбранного в зависимости от условия класса. Далее, за оператором ветвления необходимо работать с этой переменной.

Но дело в том, что переменная объявленная в операторе ветвления не видна за его пределами. Да, понимаю, можно написать множество функций и в ветвлении обращаться к ним. Но поддержка такого кода тот еще геморр.

Очень прошу подсказать решение. Если вводная не понятна, пишите, попробую добавить, разъяснить.

Спасибо.
Dima T
Дата: 06.09.2018 12:04:59
Для этого наследование придумали. Сделай общий базовый класс, а свои классы унаследуй от него и все твои проблемы исчезнут.
Дмитрий Мух
Дата: 06.09.2018 13:00:16
energy75
Добрый день всем.


Прошу натолкнуть на мысль, как профессионалы реализовывают следующую задачу:

Есть несколько классов. Методы и свойства в классах абсолютно одинаково именованы, и возвращают аналогичные (типизированные) значения. Реализация методов в классах очень разнится, поэтому это не один класс, а множество классов.

Есть процедура, в которой в зависимости от входных условий необходимо в операторе ветвления объявить переменную выбранного в зависимости от условия класса. Далее, за оператором ветвления необходимо работать с этой переменной.

Но дело в том, что переменная объявленная в операторе ветвления не видна за его пределами. Да, понимаю, можно написать множество функций и в ветвлении обращаться к ним. Но поддержка такого кода тот еще геморр.

Очень прошу подсказать решение. Если вводная не понятна, пишите, попробую добавить, разъяснить.

Спасибо.

Язык какой? Шаблон Стратегия.
energy75
Дата: 06.09.2018 14:00:02
Dima T, Дмитрий Мух, спасибо за участие.


с наследованием немного знаком, но, понятное дело недостаточно. Не сдвинулся я с места, не хватает знаний, как прикрутить.

Ну, допустим, вот наши классы:
public class Papa
{
    public string param1 { get; set; }
    public Int32 param2 { get; set; }
}


public class Child1 : Papa
{
    public Int32 diablo(Int32 inVar)
    {
        return inVar * 10;
    }
}

public class Child2 : Papa
{
    public Int32 diablo(Int32 inVar)
    {
        return inVar * 2000;
    }
}

И вот нам надо их поюзать:
public void rr(byte inVar)
{
    switch (inVar)
    {
        case 1:
            {
                Child1 ddd = new Child1();
                break;
            }

        case 2:
            {
                Child2 ddd = new Child2();
                break;
            }
    }


    Console.WriteLine(ddd.diablo(inVar));
}


Понятное дело, в последней строчке ошибка, нифига не сработает. Поправьте меня плиз.
Спасибо.
Dima T
Дата: 06.09.2018 14:39:36
public class Papa
{
    public string param1 { get; set; }
    public Int32 param2 { get; set; }

    public Int32 diablo(Int32 inVar)
    {
        return 0;
    }
}
...

public void rr(byte inVar)
{
    Papa ddd;
    switch (inVar)
    {
        case 1:
            {
                ddd = new Child1();
                break;
            }

        case 2:
            {
                ddd = new Child2();
                break;
            }
    }


    Console.WriteLine(ddd.diablo(inVar));
}

И по синтаксису объявления и переопределения методов есть нюансы, зависит от ЯП. По C# можно почитать про наследование и про интерфейсы
energy75
Дата: 06.09.2018 15:18:28
Dima T, спасибо, вижу что сделал первый шаг.

Признаться, пишу на vb, а сюда постил на шарпе, понимая, что сообщество в основном на нём. К сожалению, сейчас нужно прикрепить принтскрин, поэтому и рождена эта строчка.


Итак. Сдвинулся с места, нашел собственно того, чего не доставало - Overloads , перегрузки. Ваш Return=0 к этому подвинул.
Итак, классы выглядят теперь вот так:
Public Class Papa
    Public Property param1 As String
    Public Property param2 As Int32
    Public Function diablo(inVar As Int32) As Int32
        Return 0
    End Function

End Class


Public Class Child1
    Inherits Papa
    Public Overloads Function diablo(inVar As Int32) As Int32
        Return inVar * 10
    End Function
End Class

Public Class Child2
    Inherits Papa
    Public Overloads Function diablo(inVar As Int32) As Int32
        Return inVar * 2000
    End Function
End Class



Но основная задача не решена. Выбор класса в ветвлении. Ваш пример к сожалению с ошибкой:
Dima T
Дата: 06.09.2018 15:24:42
energy75
Но основная задача не решена. Выбор класса в ветвлении. Ваш пример к сожалению с ошибкой:

Ты криво мой пример перевел, внутри select не надо Dim

Я не силен в VB.NET. Почитай
energy75
Дата: 06.09.2018 20:24:45
Dima T,

ОГРОМНОЕ СПАСИБО!!!!!!!!

Все получилось.
energy75
Дата: 06.09.2018 20:46:24
Опубликую работающий код, вдруг кому....


Public Class Papa
    Public Property param1 As String
    Public Property param2 As Int32
    Public Overridable Function Diablo(inVar As Int32) As Int32
        Return 555
    End Function

End Class


Public Class Child1
    Inherits Papa
    Public Overrides Function Diablo(inVar As Int32) As Int32
        Return inVar * 10
    End Function
End Class

Public Class Child2
    Inherits Papa
    Public Overrides Function diablo(inVar As Int32) As Int32
        Return inVar * 2000
    End Function
End Class
'******************************************************************
Module Module1

    Sub Main()
        Console.WriteLine(selection(1))
        Console.WriteLine(selection(2))
        Console.ReadLine()
    End Sub


'******************************************************************
    Public Function selection(inB As Byte) As Int32
        Dim myPapa As New Papa

        Select Case inB
            Case 1
                myPapa = New Child1
            Case 2
                myPapa = New Child2
        End Select

        Return myPapa.Diablo(inB)

    End Function
End Module