C# Can';无法从扩展类中获得价值,这是为什么?
我试图创建C# Can';无法从扩展类中获得价值,这是为什么?,c#,unity3d,C#,Unity3d,我试图创建ScriptableObject,同时我试图从继承自其他类的类中访问属性,但由于某种原因,我无法从DamageCard访问属性,即DamageAmount 这是两类: using System.Collections; using System.Collections.Generic; using UnityEngine; public enum CardType { Damage, Healing, Defence, Amplifier} [CreateAssetMen
ScriptableObject
,同时我试图从继承自其他类的类中访问属性,但由于某种原因,我无法从DamageCard
访问属性,即DamageAmount
这是两类:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum CardType { Damage, Healing, Defence, Amplifier}
[CreateAssetMenu(fileName = "New Card Item", menuName = "Inventory Syste/Item/Cards")]
public abstract class CardObjects : ScriptableObject
{
public int Id;
public Sprite icon;
public CardType type;
[TextArea(5, 10)]
public string description;
//public Sprite artwork;
public int Energy;
}
扩展CardObjects
的第二个类:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "New DamageCard Item", menuName = "Inventory Syste/Item/DamageCard")]
public class DamageCard : CardObjects
{
public int DamageAmount;
public void Awake()
{
type = CardType.Damage;
}
}
这就是我的错误所在:
public void OnDrop(PointerEventData eventData)
{
// CardItem is (DamageCard)
var item = eventData.pointerDrag.GetComponent<CardItem>(); // CardItem is (DamageCard)
Debug.Log("Dealing "+ item.card.DamageAmount + " Damage");
}
这是一个多态性相关的问题 由于DamageCard继承自CardObjects,因此DamageCard确实是一个CardObject。因此,DamageCard继承了CardObject的数据成员和方法 但是,CardObjects不一定就是损坏卡。它可以是治疗卡或防御卡等。因此,CardObjects实例没有DamageCard的数据成员和方法 由于CardItem包含CardObjects(不是DamageCard),因此您将无法访问DamageAmount数据成员,除非您:
is
关键字。is
关键字将执行条件测试并将其转换为损坏卡类型。例如:
if (item.card is DamageCard thisCard) {
Debug.Log("Dealing "+ thisCard.DamageAmount + " Damage");
}
我添加了CardItem…很抱歉不清楚,这是一个大项目,这是唯一一个没有大页面的发布方式,我认为值得一提的是我是一个新发布的人。我认为你应该在第二个代码块中使用
is
关键字,而不是GetType()
函数
public void OnDrop(PointerEventData eventData)
{
// CardItem is (DamageCard)
var item = eventData.pointerDrag.GetComponent<CardItem>(); // CardItem is (DamageCard)
if (item.card.type == CardType.Damage) {
DamageCard thisCard = (DamageCard) item.card; // Cast the CardObjects to a DamageCard
Debug.Log("Dealing "+ thisCard.DamageAmount + " Damage");
}
}
if (item.card.GetType() == typeof(DamageCard)) {
DamageCard thisCard = (DamageCard) item.card; // Cast the CardObjects to a DamageCard
Debug.Log("Dealing "+ thisCard.DamageAmount + " Damage");
}
if (item.card is DamageCard thisCard) {
Debug.Log("Dealing "+ thisCard.DamageAmount + " Damage");
}