仅从基类函数
本文关键字:类函数 基类 | 更新日期: 2023-09-27 17:56:51
我正在制作这个游戏,但我遇到了结构问题。我创建了一个名为 Structure 的类,其他类如 Traps、Shelter、Fireplace 继承自该类。游戏中的瓷砖有自己的类(Tile),并在该瓷砖上有一个结构列表。我可以成功地在列表中包含的瓷砖上构建结构。当我尝试从陷阱等类访问函数时,问题就来了,它不起作用。我只能使用基类结构中的函数。
磁贴中的列表:
class Tile
{
public List<Structure> Structures = new List<Structure>();
}
如何建造陷阱或其他建筑:
bool anyFireplace = Bundle.map.tile[Bundle.player.X, Bundle.player.Y].Structures.OfType<Shelter>().Any();
if (!anyFireplace)
{
woodlogsCost = 4;
if (Bundle.player.Woodlogs - woodlogsCost >= 0)
{
Bundle.map.tile[Bundle.player.X, Bundle.player.Y].Structures.Add(new Shelter(Bundle.player.X, Bundle.player.Y));
Bundle.player.Woodlogs -= woodlogsCost;
}
}
当我绘制结构时(这是我的问题所在,请注意注释)
foreach (Structure s in Bundle.map.tile[x, y].Structures)
{
if (s is Fireplace)
{
//This is the function from base class Strucure
s.ColorBody(g, 10, x - minx, y - miny, 0, Brushes.Firebrick);
// The function that I wan´t to use but can´t be used
//s.ColorBody(g, x - minx, y - miny);
}
if (s is Shelter)
{
s.ColorBody(g, 10, x - minx, y - miny, 1, Brushes.ForestGreen);
}
if (s is Sleepingplace)
{
s.ColorBody(g, 10, x - minx, y - miny, 2, Brushes.Brown);
}
if (s is Trap)
{
s.ColorBody(g, 10, x - minx, y - miny, 3, Brushes.Silver);
}
if (s is Barricade)
{
s.ColorBody(g, 10, x - minx, y - miny, 4, Brushes.DarkOliveGreen);
}
}
所以。。。我想知道如何访问我不想使用的功能?
将虚拟方法添加到基类;
public class Structure
{
public virtual void ColorBody(Graphics g, int someParam1, int someParam2)
{
// do nothing in the base class
}
}
并重写 FireBody 中的方法
public class FireBody : Structure
{
public override void ColorBody(Graphics g, int someParam1, int someParam2)
{
// do something here for FireBody
}
}
如果所有继承自Structure
的类都需要它,那么就让它抽象起来;
public abstract class Structure
{
public abstract void ColorBody(Graphics g, int someParam1, int someParam2);
}
对计算机来说,s
只是一个Structure
。如果要调用只有Fireplace
类具有而抽象类Structure
没有的特定方法(例如 Fireplace
类可能有一个BurnWood()
方法,而该方法对Structure
没有意义),那么你想让计算机知道这个Structure
实际上也是一个Fireplace
(例如)。所以你可以通过铸造来做到这一点;例如:
((Fireplace)s).ColorBody(g, x - minx, y - miny);
或
(s as Fireplace).ColorBody(g, x - minx, y - miny);
请参阅这篇文章,了解转换和使用as
运算符之间的区别。
正如我从您的问题中注意到的那样,您在两个类中有两个重载函数,即对于基类和派生类,您有不同的数字函数参数
在这种情况下,您必须支持编译类型的多语,如下所示
public BaseQueryClass
{
public string QueryClassFunc(string mystring, int i)
{
return mystring + i.ToString();
}
}
public QueryClassDerived : BaseQueryClass
{
public string QueryClassFunc(string mystring)
{
return mystring;
}
}
您可以调用如下所示的方法
BaseQueryClass qClass = new BaseQueryClass();
qClass.QueryClassFunc("mystring", 1);
((QueryClassDerived)qClass).QueryClassFunc("test");
希望我在这里没有错过任何东西