我在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) { }
}
很抱歉,问题看起来非常大且令人困惑,但是我无法以其他方式使我的问题变得清楚。
答案 0 :(得分:2)
您永远不会在Error: Measured peak bitrate compared to master playlist declared value exceeds error tolerance
--> Detail: Measured: 1111.54 kb/s, Master playlist: 1680.80 kb/s, Error: 33.87%
--> Source: /Users/Bun/Documents/CODING/CosmicPerspectiveAssets/01-FalconHeavy/HLS/FHVidmaster.m3u8
--> Compare: out_2.m3u8
--> Detail: Measured: 1178.21 kb/s, Master playlist: 5711.20 kb/s, Error: 79.37%
--> Source: /Users/Bun/Documents/CODING/CosmicPerspectiveAssets/01-FalconHeavy/HLS/FHVidmaster.m3u8
--> Compare: out_0.m3u8
--> Detail: Measured: 1109.03 kb/s, Master playlist: 3220.80 kb/s, Error: 65.57%
--> Source: /Users/Bun/Documents/CODING/CosmicPerspectiveAssets/01-FalconHeavy/HLS/FHVidmaster.m3u8
--> Compare: out_1.m3u8
和T
或您提供的其余代码中使用IUnit<T>
。因此,使用泛型是没有用的...
所以您可以简单地写:
Unit<T>
现在,如果您想使用泛型来做一些我不了解的事情,则可以通过使用纸,铅笔和带矩形的矩形绘制简单的图形来细化设计,或者可以使用UML。
有一个问题要问你:为什么要使用接口?
要回答这个问题,请问:我编写的定义接口的代码,我用它来做什么?
与泛型相同。