C#从基类实例访问子类Proprieties

时间:2018-02-15 13:56:01

标签: c# inheritance unity3d

我真的不知道如何制定我的问题对我来说有点复杂,我会尽力解释。

我正在制作太空游戏,我有一个代表地方的基类,我想拥有不同类型的地方,如行星,空间站,星号,贸易船等。玩家可以点击这些物品并获得信息。

所以我的课程看起来像这样:

secondServ

我有一个委托接受像参数中的PlacePlace这样的函数,因为我不想为我所拥有的每种类型的地方制作委托。

在另一个应该显示任何类型Place的信息的脚本中,我收到玩家点击的Place对象。我想我找到了一个解决方案,但这样做是否正确呢?

public class Place {

    public int placeId;
    public string placeName;
    public string placeDescription;

    /* Place constructor */

}

public class Planet : Place {

    /* Specific proprieties of planet */

    public PlanetType planetType;
    public int planetSize;
    ...

    // Planet constructor

    public Planet(int placeId, string placeName, string placeDescription,  PlanetType planetType, int planetSize) : base(placeId, placeName, placeDescription) {
       this.planetType = planetType;
       this.planetSize = planetSize;    
       ...
    }
}

将其置于开关盒中,以便我可以处理任何类型。我只是希望能够从任何派生类的Place中获取属性,以便在UI中显示它们。我想知道更好的方法来实现这一目标。

但是我想知道我的设计是否正常和必要,因为我没有使用继承/多态,我觉得我的做法是错误的。

1 个答案:

答案 0 :(得分:0)

我可以让UI部分显示属性一个特定的地方通用以接受像PropertyItem这样的东西,你可以自己决定属性。

public class PropertyItem
{
    public string Text { get; set; }
    public object Value { get; set; }
}

然后在你的select方法中,你只需调用基类的抽象方法(也使你的基类抽象)

public abstract class Place
{
    ... 

    public abstract IEnumerable<PropertyItem> GetProperties();
}

现在你可以在你的星球中覆盖它

public class Planet : Place
{
    ... 

    public override IEnumerable<PropertyItem> GetProperties()
    {
        yield return new PropertyItem { Text = "Size", Value = this.planetSize };
    }
}

最终,您将使用GetProperties()方法获取您所在位置的属性,并以表格形式显示它们,或者您的UI知道如何处理PropertyItem类型。

private void updateSelectedPlaceUI(object sender, EventsController.PlaceEventArgs placeArgs)
{
    MyUserInterfaceWidget.DisplayProperties(placeArgs.Place.GetProperties());
}