无法从一种类型转换为其他类型

时间:2019-10-05 11:41:41

标签: c# .net generics

我在OOP中实习,并且创建了一个简单的控制台应用程序,其中有3个派系,每个派系必须拥有自己的军队,并且每个不同的军队都可以包含某些部队。

我使用了接口和继承,但是在通用转换中有一些问题。我不知道如何以正确的方式解决此问题,请帮助我。

这是代码。

这是我的ArmyUnits的实现。

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) { }

}

很抱歉,问题看起来非常大且令人困惑,但是我无法以其他方式使我的问题变得清楚。

1 个答案:

答案 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。

UML Tutorial

有一个问题要问你:为什么要使用接口?

要回答这个问题,请问:我编写的定义接口的代码,我用它来做什么?

与泛型相同。

What is the difference between an interface and a class, and why I should use an interface when I can implement the methods directly in the class?

C# Generics Level 1
C# Generics Level 2
Generics in .NET

相关问题