我真的不知道如何制定我的问题对我来说有点复杂,我会尽力解释。
我正在制作太空游戏,我有一个代表地方的基类,我想拥有不同类型的地方,如行星,空间站,星号,贸易船等。玩家可以点击这些物品并获得信息。
所以我的课程看起来像这样:
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中显示它们。我想知道更好的方法来实现这一目标。
但是我想知道我的设计是否正常和必要,因为我没有使用继承/多态,我觉得我的做法是错误的。
答案 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());
}