Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.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#_Class_Object_Unity3d_Overloading - Fatal编程技术网

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

C# 数据类型,它可以表示多个具有某些公共属性的不同类,而无需继承,c#,class,object,unity3d,overloading,C#,Class,Object,Unity3d,Overloading,我在联合体与c#一起工作。我有一个叫做CarPart的类,它源于monobhavior(M.B.是每个unity脚本的基类)。在这个类中,我声明了不能从任何基类派生的特定汽车零件类,因为unity inspector不会显示它们的属性,但它们需要单行为,所以我在类(CarPart)中声明了它们,该类确实派生自单行为 public class CarPart : MonoBehaviour { [System.Serializable] //required to show full o

我在联合体与c#一起工作。我有一个叫做CarPart的类,它源于monobhavior(M.B.是每个unity脚本的基类)。在这个类中,我声明了不能从任何基类派生的特定汽车零件类,因为unity inspector不会显示它们的属性,但它们需要单行为,所以我在类(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,它是manager游戏对象的组件(这个G.O.在整个游戏中是活动的)。VehicleConfig正在与GUI通信,并根据GUI输入配置车辆。它还声明了所有汽车部件,这些部件将在稍后从检查员(功率、悬架深度)和3D模型(预制件)中指定特定值


我的问题是,我的汽车部件比发动机和底盘要具体得多,而且所有这些部件都有比Equipment()更为常见的方法和具体实现。另外,Setup()比上面的示例稍微复杂一些。因此,我希望Setup()重载一些数据类型,这些数据类型可以表示所有汽车零件(发动机、底盘等)的所有常用方法和属性,然后我可以重载Setup(),例如转换为该特殊数据类型的发动机[0]。我知道有不同的方法用抽象类和所有常见的抽象方法来实现此功能,这些抽象方法将是像引擎或机箱之类的派生类,并将为这些方法提供特定的实现,但正如我前面提到的,unity inspector无法显示派生类的成员变量。如果有人有建议、想法或完全不同的方法。我非常感谢您提前提及:)thx。

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

public class CarBase
{
    public GameObject prefab;
    public int price;
}
然后,创建一个必须为方法实现的接口。我建议
ICAP

public interface ICarEquip
{
    public void Equip();
}
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()
    {

    }
}
现在,对于您想要创建的任何汽车零件,都可以从Unity的
Monobhavior
和您自己的
ICarEquip

public interface ICarEquip
{
    public void Equip();
}
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()
    {

    }
}
您不会回避这样一个事实,即您的汽车零件类别彼此不同,但您将从干式(不要重复)原则中获益匪浅


您的
VehicleConfig
类必须更改其访问和应用这些组件的方式。我不会让它实现
CarBase
,因为它不是一种CarBase。您的
VehicleConfig
将承担更多的功能。它将以各自的方式与不同的汽车部件进行交互。

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

public class CarBase
{
    public GameObject prefab;
    public int price;
}
然后,创建一个必须为方法实现的接口。我建议
ICAP

public interface ICarEquip
{
    public void Equip();
}
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()
    {

    }
}
现在,对于您想要创建的任何汽车零件,都可以从Unity的
Monobhavior
和您自己的
ICarEquip

public interface ICarEquip
{
    public void Equip();
}
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()
    {

    }
}
您不会回避这样一个事实,即您的汽车零件类别彼此不同,但您将从干式(不要重复)原则中获益匪浅


您的
VehicleConfig
类必须更改其访问和应用这些组件的方式。我不会让它实现
CarBase
,因为它不是一种CarBase。您的
VehicleConfig
将承担更多的功能。它将以各自的方式与不同的汽车零件交互。

我不太确定抽象类有什么问题,但您可以使用抽象类来实现所需的功能,并在inspector中提供属性:

public abstract class CarElement
{
  //common properties for all car parts
  public GameObject prefab;
  public int price;
  public abstract void Equip();
}

[System.Serializable] //required to show full objects in inspector
public class Chassis : CarElement
{
    //specific properties for every car part
    public bool AWD;
    public int suspensionDepth;
    public override void Equip() { }
}

[System.Serializable] //required to show full objects in inspector
public class Engine : CarElement
{
    //specific properties for every car part
    public bool supportsAddOnExhaust;
    public int power;
    public override void Equip(){ }
}

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(CarElement component)
    {
          component.Equip();
          DoSomethingWithCommonVariables(component.price, component.prefab);
    }
    //method called from GUI example:
    public void MountFirstEngine()
    {
        Setup(engines[0]);
    }
}

我不太确定抽象类有什么问题,但您可以使用抽象类实现所需的功能,并在inspector中提供属性:

public abstract class CarElement
{
  //common properties for all car parts
  public GameObject prefab;
  public int price;
  public abstract void Equip();
}

[System.Serializable] //required to show full objects in inspector
public class Chassis : CarElement
{
    //specific properties for every car part
    public bool AWD;
    public int suspensionDepth;
    public override void Equip() { }
}

[System.Serializable] //required to show full objects in inspector
public class Engine : CarElement
{
    //specific properties for every car part
    public bool supportsAddOnExhaust;
    public int power;
    public override void Equip(){ }
}

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(CarElement component)
    {
          component.Equip();
          DoSomethingWithCommonVariables(component.price, component.prefab);
    }
    //method called from GUI example:
    public void MountFirstEngine()
    {
        Setup(engines[0]);
    }
}

您可以使用接口表示所有常用方法和属性。然后,您的方法将该接口作为
未知数据类型
。您可以尝试使用多个接口:
公共类车辆配置:monobhavior,CarPart
。您可以使用接口表示所有常用方法和属性。然后,您的方法将该接口作为
未知数据类型
。您可以尝试使用多个接口:
公共类车辆配置:MonoBehavior,CarPart
。这是最明显的解决方案,我缺少inspector仅隐藏从MonoBehavior派生的类的属性,所以我是这样做的,除了我把所有的汽车零件类(引擎,底盘…)放在从MonoBehavior派生的类中,因为我需要汽车零件类能够使用MonoBehavior提供的方法。感谢您的帮助。这是最明显的解决方案,我不知道inspector只隐藏从MonoBehavior派生的类的属性,所以我这样做了,只是我把所有的汽车零件类(发动机、底盘…)都放进去了内部类是从MonoBehavior派生的,因为我需要汽车零件类能够使用MonoBehavior提供的方法。谢谢你帮助我。