设置抽象类变量值的正确方法

时间:2019-01-29 09:48:07

标签: c# oop unity3d

我有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类是CamFlyCamWalk的基类。现在,我想更改基类camera script的变量值,因此我在每个类(CamFlyCamWalk)中都使用了此函数

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 :(得分:1)

请检查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++;
    }
}

答案 1 :(得分:0)

  

具有Camera个脚本类,用于执行清除任务,它包含这些变量和一个事件

我没有看到任何事件,看到一个返回Awake的虚方法。

  

它工作正常,可以满足我的要求,但是它肯定不是很好的代码

您怎么认为呢?是的,它是可改进的,但我看到的要差得多。

  

我很困惑如何正确执行操作

是的,有时所有使用都会发生...

我的两分钱的建议:

  1. 通常,不要直接公开字段。如果这些字段可以修改,请使用读/写属性。这样,您始终可以确保基类的状态保持一致。
  2. 适当地命名方法,以便名称传达方法的作用。 SetCullingValues并未清楚该方法还将调用Awake。叫它SetCullingValuesAndAwake或不叫Awake
  3. 为什么SetCullingValues甚至在派生类型中声明?以基本类型声明它。

1 3 假定您有权访问Camera。如果不这样做,那么您将无能为力,无法改善已有的东西。