问题 访问列表中派生对象的属性

狮子座

新成员
已加入
2016年9月8日
留言内容
1
编程经验
Beginner
你好!如标题所述,我对对象列表(包括派生类)有疑问。如果有帮助,请提供一些有关编程经验的背景信息:上高中时我曾自学过一些Visual Basic和C ++,但是我没有任何正式的培训或编程方面的专业知识。我是自学C#,并且我相信我至少对基本原理有相当扎实的掌握,尽管显然我还有很长的路要走。我目前正在使用Visual Studio Express 2015 for Desktop,尽管不是100%,但我相信它使用最新的.NET框架。

自从尝试自学习C ++以来,我一直想做一个项目,并实践OOP,类和继承的基础知识,我正在开发一个基本的RPG风格游戏,或者至少是一个人的核心机制。 。现在,我正在为项目编写代码。到目前为止,我还没有将整个代码拍到帖子上,而是拥有以下继承结构:

项目 - Base class, is abstracted;
设备:物品;
消耗品:物品; -仍在进行中,但是具有不同属性的消耗品将衍生出几种对象;
装甲:设备;
武器:装备

我还创建了一个Character类,其中除其他外,还具有System.Collections.Generic.List<Items>称为库存。预期的应用程序符合您的期望;我希望角色自然有物品清单。因为列表是项,所以我可以很高兴地将任何派生类项推入其中,并且程序对此没有任何问题。我的Main方法通过测试来初始化字符,提供清单,创建多个项目的实例并将其添加到列表中。这有效100%!到目前为止,我对结果感到满意。

但是,我遇到的问题是是否要访问该清单中的派生类的属性!读取和写入项中存在的属性不是问题;属性,例如Name,Weight,ItemValue和诸如此类,我可以毫无问题地获取并设置为我的内心内容。但是,假设我想获取一件盔甲的ArmorClass或对其进行更改……该特定Property在Armor中一直处于下降状态,其继承水平比Items低两个等级。如果我尝试访问它,则编译器会抱怨Items没有该属性。我不想将属性移动到Items,因为许多Items都不需要这样的属性。

在网上环顾四周后,我确实设法找到了一种获取信息的方法,尽管它很笨拙并且可能占用大量资源。在这种情况下,代码的目的是通过切换“装备”派生类中的“装备”布尔值来“装备”一个物品。

C#:
Type type = inventory[invPos].GetType(); // Make sure the item to be equipped is fetched from inventory and is actually armor.
Type compare = typeof(Armor); // A point of comparison; type should equal this if the item specified is actually an armor piece.
if (type != compare)
    return 3; // Temp debugging error code.

Armor a = (Armor)inventory[invPos]; // Brings in copy of item to inspect - there's got to be a better way.

正如我在评论中提到的那样,为了获取属于派生类的属性,这 可以按预期工作,但是带入整个对象的副本来检查一个属性似乎不必要地浪费了系统资源。坦白说,对我来说,这似乎是一种hack。当然,我在编程方面还比较陌生,但是感觉应该有一个更优雅的解决方案-我注意到C#在某些方面比C ++更加简单易用,所以我觉得很奇怪这不是其中之一。

至于设置属性,再次使用我不喜欢的代码。跳过一些有效性检查,这实际上是翻转开关的代码:

C#:
// Now that we've verified that the item is equippable and no obstructing items are in the way, equip it.
a.Equipped = true;

// Dirty trick - removing the non-equipped version and replacing it with our copy.
inventory.RemoveAt(invPos);
inventory.Insert(invPos, a);
return 0; // Success.

同样,从技术上讲,这确实可行,但它看起来是如此间接和错误。我觉得我应该能够访问Armor实例的“方法”,即使它在“项目”列表中也是如此,并且无需进行复制,修改副本,删除原始副本并将其推到新位置即可进行修改。问题是,我可能不像该委员会的用户那样熟悉c#提供的大量关键字。如果可以,请帮助我清理代码;我非常感谢能获得的任何帮助。

编辑:我一直在寻找更多的资源,而我等待答复。我设法找到一种更好的方法来完成我在第一段代码中所做的工作:"as"关键字,这是我以前不知道的。所以现在看起来像这样:

C#:
/* Pre Equip Check: Make sure the item to be equipped is fetched from inventory and is actually armor.
 * If the item is not armor, return error 3.*/

Armor a = inventory[invPos] as Armor;
if (a == null)
    return 3;

这比我以前做的要干净得多。我通过装备装甲进行了测试,然后尝试使用EquipArmor方法将一种装备为一种武器-它没有按预期工作。

所以我想现在我仍然坚持的最大的事情是第二部分。我真的不喜欢复制对象,修改副本,删除原始对象并在其位置插入新对象。对于这样的事情,可能不是世界末日,但是我正在想象一个具有大量字段和属性的大型物体,并以为自己这不是最佳实践。有没有更干净的方法来完成我在那儿所做的事情?
 
Last edited:
最佳 底部