Estoy tratando de crear un simple "inventario" de artículos, muy parecido a cualquier juego de rol. Tengo muy básico clases hechas, que tienen propiedades.C# List <baseClass> - ¿alguna forma de almacenar clases heredadas también?
De todos modos, tengo una clase base de item
y heredando de eso es weapon
. item
tiene propiedades (nombre, valor, peso, "elemento importante") que también se usan en weapon
, pero weapon
tiene propiedades adicionales (ataque, defensa, velocidad, lateralidad).
Tengo el siguiente código (lo siento si la legibilidad es horrible):
static void Main(string[] args)
{
List<item> inventory = new List<item>();
inventory.Add(new weapon("Souleater", 4000, 25.50f, false, 75, 30, 1.25f, 2));
//item---------------------------> weapon--------->
Console.Write("Name: {0}\nValue: {1}\nWeight: {2}\nDiscardable: {3}\nAttack: {4}\nDefense: {5}\nSpeed: {6}\nHandedness: {7}",
inventory[0].Name, inventory[0].BValue, inventory[0].Weight, inventory[0].Discard,
inventory[0].Atk, inventory[0].Def, inventory[0].Speed, inventory[0].Hands);
Console.ReadLine();
}
Básicamente, lo que estoy tratando de hacer es añadir una nueva weapon
al inventario, pero el inventario es una List<item>
tipo. Salí en un capricho con la esperanza de que, debido a su herencia, sería aceptado. Era, pero las propiedades específicas de weapon
no son capaces de ser visitada:
('shopSystem.item' no contiene una definición para 'Atk' y no método de extensión 'Atk' aceptar un primer argumento de tipo 'shopSystem.item' se puede encontrar)
Entonces, ¿hay alguna manera de lograr lo que pretendía aquí? ¿Tiene un "inventario" que puede almacenar objetos item
, así como objetos weapon
, armour
, accessory
etc., que heredan de item
? También vale la pena mencionar que puedo acceder a todas las propiedades deseadas si declaro lo siguiente:
weapon Foo = new weapon("Sword", 200, 20.00f, false, 30, 20, 1.10f, 1);
Muchas gracias por su lectura.
Aquí está la item
y weapon
clases, si alguien está interesado:
class item
{
#region Region: Item Attributes
protected string name = "";
protected int baseValue = 0;
protected float weight = 0.00f;
protected bool noDiscard = false;
#endregion
public item(string n, int v, float w, bool nd){
name = n; baseValue = v; weight = w; noDiscard = nd;}
public string Name{
get{return name;}
set{if(value != ""){
name = value;}
}//end set
}
public int BValue{
get{return baseValue;}
}
public float Weight{
get{return weight;}
}
public bool Discard{
get{return noDiscard;}
}
}
class weapon : item
{
#region Region: Weapon Attributes
private int atk = 0;
private int def = 0;
private float speed = 0.00f;
private byte hands = 0;
#endregion
public weapon(string n, int v, float w, bool nd, int a, int d, float s, byte h) : base(n, v, w, nd){
atk = a; def =d; speed = s; hands = h;}
public int Atk{
get{return atk;}
}
public int Def{
get{return def;}
}
public float Speed{
get{return speed;}
}
public byte Hands{
get{return hands;}
}
}
Si uso el inventario '(weapon) [0] .Atk', sigo recibiendo el mismo mensaje de error. – Deadrust
Intenta usar ((armamento) inventario [0]). Atk en cambio –
Sí, ¡eso funciona! ¡Gracias! – Deadrust