Правильный способ установить значение переменной абстрактного класса - PullRequest
0 голосов
/ 29 января 2019

У меня есть класс c amera script, который выполняет выборку, и он содержит следующие переменные и событие:

    protected float CullDetailSmall = 25.0f;
    protected float CullDetailMedium = 80.0f;
    protected float CullDetailLarge = 130.0f;
    protected float CullDetailExtraLarge = 250.0f;
    protected float CullDetailXExtraLarge = 450.0f;
    protected float CullDetailXXExtaLarge = 650.0f;

public virtual void Awake(){
//culling apply logic using above variable values
}

Класс camera script является базовым классом для CamFly и CamWalk.Теперь я хочу изменить значения переменных базового класса camera script, поэтому я делаю эту функцию в каждом классе (CamFly и CamWalk)

public void SetCullingValues(int cullDetailSmall
                                , int cullDetailMedium
                                , int cullDetailLarge
                                , int cullDetailExtraLarge
                                , int cullDetailXExtraLarge
                                , int cullDetailXXExtaLarge
                                , int CullFloor
        )
    {
        base.CullDetailSmall = cullDetailSmall;
        base.CullDetailMedium = cullDetailMedium;
        base.CullDetailLarge = cullDetailLarge;
        base.CullDetailExtraLarge = cullDetailExtraLarge;
        base.CullDetailXExtraLarge = cullDetailXExtraLarge;
        base.CullDetailXXExtaLarge = cullDetailXXExtaLarge;
        base.CullFloor = CullFloor;

        base.Awake();
    }

Она работает нормально и делает то, что я хочу, ноэто конечно не хороший кусок кода.Я в восторге от того, как я могу сделать это правильно ??Помните

  1. я вызываю вышеуказанную функцию при некоторых условиях, например, если выполняется какое-то условие, затем выполняйте вышеуказанную функцию и изменяйте переменную базового класса.

  2. во-вторых, я хочу это для обоих унаследованных членов.

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Пожалуйста, проверьте следующую ссылку от Microsoft с соответствующей документацией абстрактного класса и рекомендациями.

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/abstract

Абстрактный класс используется в качестве базового шаблона для производных классов.Он используется для обеспечения соблюдения правила проектирования.

abstract class YourClass
{
    public int a;
    public abstract void A();
}

class Example : YourClass
{
    public override void A()
    {
        Console.WriteLine("Example.A");
        base.a++;
    }
}
0 голосов
/ 29 января 2019

имеет Camera класс сценариев, который выполняет выборку задачи, и он содержит эти переменные и событие

Я не вижу ни одного события, я вижу пустое возвращающее виртуальный метод с именем Awake.

Он отлично работает и делает то, что я хочу, но это, конечно, не очень хороший кусок кода

Что заставляет вас так думать?Да, это невероятно, но я видел гораздо худшее.

Я удивлен, как я могу сделать это правильно

Да, такое иногда случается со всеми...

Мои два цента совета:

  1. В общем, не выставляйте поля напрямую.Если поля могут быть изменены, используйте свойства чтения / записи.Таким образом, вы всегда можете убедиться, что состояние вашего базового класса остается согласованным.
  2. Называйте методы соответствующим образом, чтобы имя передавало то, что делает метод.SetCullingValues не дает понять, что метод также вызовет Awake.Либо назовите его SetCullingValuesAndAwake, либо не вызывайте Awake.
  3. Почему SetCullingValues даже объявлено в производных типах?Объявите это в базовом типе.

1 и 3 предполагает, что у вас есть доступ к Camera.Если вы этого не сделаете, то мало что можете сделать, чтобы улучшить то, что у вас уже есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...