【问题标题】:Right way to set abstract class variable value设置抽象类变量值的正确方法
【发布时间】:2019-01-29 09:48:07
【问题描述】:

我有执行剔除任务的 camera 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. 第二个我想为两个继承的成员这样做。

【问题讨论】:

  • 我不明白你的问题。 “肯定不是一段好代码”是什么让你这么认为?
  • 除了base 标识符是多余的,我认为这段代码没有任何问题。为什么你认为它不好?
  • 当我想要两个类中的相同功能时,它不应该是多余的。可以看到两个方法两个冗余代码。
  • 为什么不在基类中添加SetCullingValues
  • Awake() 不是“事件”,而是 Unity 调用的消息。因此,您不需要从其他方法调用它。您应该正确命名该方法,并且只在 Awake 中使用它...会更干净

标签: c# oop unity3d


【解决方案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++;
    }
}

【讨论】:

  • @MuhammadFaizanKhan José 在这里试图正确说明的是,在您的情况下,实际上根本不需要/参考使用abstractvirtual 也可以用在非抽象类中。
【解决方案2】:

Camera 执行剔除任务的脚本类,它包含这些变量和一个事件

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

它工作正常,做我想做的事,但它肯定不是一段好的代码

是什么让你这么想?是的,它可以改进,但我见过更糟糕的情况。

我很惊讶我怎么能正确地做到这一点

是的,这有时会发生在所有使用中......

我的两分建议:

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

13 假定您有权访问 Camera。如果你不这样做,那么你就无法做很多事情来改善你已经拥有的东西。

【讨论】:

  • Awake 是一个事件。我无法直接获取相机脚本,它用作飞行和行走凸轮的基类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 2013-08-13
  • 1970-01-01
相关资源
最近更新 更多