【发布时间】:2026-01-14 13:25:02
【问题描述】:
我在 OOP 中练习,我创建了一个简单的控制台应用程序,其中我有 3 个派系,每个派系都必须有自己的军队,每个不同的军队都可以包含某些单位。
我使用了接口和继承,但是我在泛型转换中遇到了一些问题。我不知道如何以正确的方式解决这个问题,请帮助我。
这里是代码。
这是我的Army 和Units 实现。
public abstract class Unit<T> : IUnit<T> where T : Faction {
public string UnitName { get; set; }
public IFaction Nation { get; set; }
public Unit(string name) {
UnitName = name;
}
public virtual void PrintUnitInfo() {
Console.WriteLine($"UnitName: {UnitName}\nNation: {Nation}\n");
}
}
public interface IUnit<T> where T : IFaction {
string UnitName { get; set; }
IFaction Nation { get; set; }
void PrintUnitInfo();
}
public class Army<T> where T : IFaction {
private List<IUnit<T>> units = new List<IUnit<T>>();
public void Recruit(IUnit<T> unit) {
units.Add(unit);
}
public void PrintFactionName() {
Console.WriteLine(nameof(IFaction));
}
}
这是Faction 的实现。
public abstract class Faction : IFaction {
public string Name { get; }
public int Minerals { get; set; }
public Army<Faction> Army { get; set; }
public Faction(string name, Army<Faction> army) {
Name = name;
Minerals = 100;
Army = army;
}
public virtual void Greetings() {
Console.WriteLine("Printing FucntionInfo from BaseFaction");
}
public virtual void PrintUnitsInfo() {
Console.WriteLine("Printing UnitsInfo from BaseFaction");
}
}
public interface IFaction {
string Name { get; }
Army<Faction> Army { get; set; }
int Minerals { get; set; }
void Greetings();
void PrintUnitsInfo();
}
最后这里是编译器显示错误的用法:
Cannot convert from 'Army<Zerg>' to 'Army<Faction>".
public static void Main(string[] args) {
Faction zerg = new Zerg("Zerg", new Army<Zerg>());
zerg.Army.PrintFactionName();
Console.ReadKey();
}
}
public class Zerg : Faction {
public Zerg(string name, Army<Faction> army) : base(name, army) { }
}
抱歉,如果问题看起来非常大且令人困惑,但我无法通过其他方式明确我的问题。
【问题讨论】:
-
拜托,主要的邮政编码,而不是图像!您永远不会在
IUnit<T>和Unit<T>中使用T,也不会在您提供的其余代码中使用。所以用泛型也没用…… -
但是如何在没有泛型的情况下指定某个军队的派系呢?好的,我会编辑它
-
尝试使用 UML 或仅使用纸和铅笔绘制矩形和线条来绘制层次结构图。你会看到你设计的缺陷。
-
我试过了,但每次尝试都无法达到我想要的效果