Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 设置抽象类变量值的正确方法_C#_Oop_Unity3d - Fatal编程技术网

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

C# 设置抽象类变量值的正确方法,c#,oop,unity3d,C#,Oop,Unity3d,我有一个camerascript类,它执行剔除任务,它包含以下变量和一个事件: protected float CullDetailSmall = 25.0f; protected float CullDetailMedium = 80.0f; protected float CullDetailLarge = 130.0f; protected float CullDetailExtraLarge = 250.0f; protected float Cu

我有一个c
amerascript
类,它执行剔除任务,它包含以下变量和一个事件:

    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脚本
类是
CamFly
CamWalk
的基类。现在我想更改基类
camera脚本
变量值,因此我在每个类(
CamFly
CamWalk
)中创建此函数

它工作得很好,做了我想做的事情,但它肯定不是一段好代码。我很高兴我怎么才能正确地做呢??记得吗

  • 我在某些条件下调用上述函数,比如 条件匹配后,执行上述函数并更改基数 类变量

  • 第二,我想为两个继承的成员都这样做

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

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

    它工作得很好,做了我想做的事情,但它肯定不是一段好代码

    你怎么会这么想?是的,它是可以改进的,但我见过更糟的

    我感到困惑的是,我怎样才能正确地做这件事

    是的,有时这会发生在所有人身上

    我的两分钱建议:

  • 通常,不要直接公开字段。如果字段需要修改,请使用读/写属性。通过这种方式,您可以始终确保基类的状态保持一致
  • 恰当地命名方法,以便名称传达方法的功能
    SetCullingValues
    没有明确说明该方法也将调用
    Awake
    。可以调用它
    SetCullingValues和away
    ,也可以不调用
    away
  • 为什么
    SetCullingValues
    甚至在派生类型中声明?在基类型中声明它
    1和3假设您有权访问
    摄像机
    。如果您没有这样做,那么您就无法改进现有的功能。

    请查看Microsoft的下一个链接,其中包含相关的抽象类文档和最佳实践

    抽象类用作派生类的基模板。它用于强制执行设计规则

    abstract class YourClass
    {
        public int a;
        public abstract void A();
    }
    
    class Example : YourClass
    {
        public override void A()
        {
            Console.WriteLine("Example.A");
            base.a++;
        }
    }
    

    我不明白你的问题。“当然不是一段好的代码”是什么让你这么想的?除了
    base
    标识符是冗余的这一事实之外,我认为这段代码没有任何问题。为什么你认为它不好?当我想在两个类中使用相同的功能时,它就不应该是多余的。您可以看到两个方法和两个冗余代码。为什么不在基类中输入元素
    SetCullingValues
    Awake()
    不是一个“事件”,而是由Unity调用的消息。因此,您不需要从其他方法调用它。您应该正确命名该方法,并且只在
    Awake
    中使用它。。。会更干净。
    唤醒
    是一个事件。我无法直接获取相机脚本,因为它是飞行和行走摄像头的基类。@MuhammadFaizanKhan José试图在这里正确地说明的是,在您的情况下,实际上根本不需要/引用使用
    abstract
    <代码>虚拟也可用于非抽象类。
    abstract class YourClass
    {
        public int a;
        public abstract void A();
    }
    
    class Example : YourClass
    {
        public override void A()
        {
            Console.WriteLine("Example.A");
            base.a++;
        }
    }