可以表示具有某些公共属性而不继承的多个不同类的数据类型

时间:2019-02-06 19:35:28

标签: c# class object unity3d overloading

我正在统一使用c#。我有一个名为CarPart的类,该类派生自MonoBehaviour(M.B。是每个统一脚本的基类)。在此类中,我声明了不能从任何基类派生的特定汽车零件类,因为统一检查器不会显示其属性,但是它们需要单声道行为,因此我在确实源自MonoBehaviour的类(CarPart)中声明了它们。

public class CarPart : MonoBehaviour {

    [System.Serializable] //required to show full objects in inspector
    public class Chassis {
        //common properties for all car parts
        public GameObject prefab;
        public int price;
        //specific properties for every car part
        public bool AWD;
        public int suspensionDepth;
        //specific implementation of equip for chassis
        public void equip() {
            //instantiate chassis as root object 
        }
    }
    [System.Serializable] //required to show full objects in inspector
    public class Engine {
        //common properties for all car parts
        public GameObject prefab;
        public int price;
        //specific properties for every car part
        public bool supportsAddOnExhaust;
        public int power;
        //specific implementation of Equip for engine
        public void Equip() {
            //instantiate engine as child object of chassis in hierarchy 
        }
    }
    //this code is heavily simplified
}

然后我有一个类VehicleConfig,它是经理游戏对象的组成部分(此目标在整个游戏中都处于活动状态)。 VehicleConfig正在与GUI通信,并基于GUI输入配置车辆。它还宣布了所有汽车部件,这些部件随后将由检查员(功率,suspendDepth)和3D模型(预制)分配特定的值。

public class VehicleConfig : CarPart{
    public Chassis[] chassis; //assigned from inspector
    public Engine[] engines;  //assigned from inspector    
    //and more car components like these two...
    //arrays because there will be multiple to chose from each type        

    public void Setup (unknownDataType component) {
        component.Equip;
        DoSomethingWithCommonVariables(component.price, component.prefab);
    }
    //method called from GUI example:
    public void MountFirstEngine() {
        Setup(engines[0]);
    }
} 

我的问题是,除了引擎和底盘之外,我还有更多特定的汽车组件,并且与Equip()相比,所有它们都有许多具有特定实现的通用方法。另外,Setup()比上面的示例要复杂一些。所以我想让Setup()重载某种数据类型,该数据类型可以表示所有汽车零件(引擎,底盘...)的所有通用方法和属性,因此我可以重载Setup(),例如将Engines [0]转换为那个特殊的数据类型。我知道,使用抽象类来实现此功能的方法有所不同,所有常见的抽象方法都将从此类类中派生,例如Engine或Chassis之类,并将为这些方法提供某些实现,但是正如我前面提到的,统一检查器无法显示派生类的成员变量。如果有人有建议,想法或完全不同的方法。我真的很感激提前提到:)。

2 个答案:

答案 0 :(得分:0)

您可以将公用数据存储在单独的对象中。我建议CarBase

public class CarBase
{
    public GameObject prefab;
    public int price;
}

然后,创建一个必须为您的方法实现的接口。我建议ICarEquip

public interface ICarEquip
{
    public void Equip();
}

现在,对于您要创建的任何汽车零件,请从Unity的MonoBehaviour和您自己的ICarEquip

派生出来。
public class Engine : MonoBehaviour, ICarEquip
{
    // Attach your CarBase information
    [System.Serializable]
    CarBase carBase;

    // Specific properties
    public bool doesSupportAddonExhaust;
    public int power;

    // Implement your interface methods
    public void Equip()
    {

    }
}

您不会绕开汽车零件类别彼此不同的事实,但是您将从DRY(请勿重复自己)原理中受益匪浅。

您的VehicleConfig类将不得不更改其访问和应用这些组件的方式。我不会使其实现CarBase,因为它不是CarBase的一种。您的VehicleConfig将承担Mediator Pattern的更多角色。它将以自己的方式与不同的汽车零件进行交互。

答案 1 :(得分:0)

我不太确定抽象类有什么问题,但是您可以使用抽象类来实现所需的内容,并在检查器中提供可用的属性:

re.findall('^BEGIN$.*?^END$', content, flags=re.DOTALL | re.MULTILINE)

enter image description here