c# - 通用抽象方法

标签 c# generics abstraction

我在尝试创建抽象类和其中的通用方法时遇到了麻烦。

class GameRoomManager : MonoBehaviour {
    public GameRoom GetSomething(string s){
        //do things here
        return GameRoomvar;
    }
}

现在我有另一个类做类似的事情,但涉及不同的类

class PlayerManager : MonoBehaviour{
    public Player GetSomething(string s){
        //player related things here
        return Playervar;
    }
}

我想让 GameRoomManager 和 PlayerManager 这两个类都继承自抽象类 Abs

class GameRoomManager : Abs{
    public override GameRoom GetSomething<GameRoom>(string s){
        return GameRoomvar;
    }
}

在哪里

public abstract class Abs{
    public T GetSomething<T>(string s);
}

我在寻找解决方案时看到了一些关于这个主题的答案,所有答案都建议抽象类本身是通用的。我不想使抽象类通用,因为我看到的示例会让我做 class GameRoomManager : Abs<GameRoomManager> .但我希望该方法返回类型 GameRoom,而不是 GameRoomManager。

我对泛型不是很熟悉,所以如果我做错了请指出正确的方向

最佳答案

您必须与 PQRHIJ 有一些共同点,才能使类使用通用方法。

A计划

用接口(interface)连接事物。

public interface IPart
{
    // put things here that are common between Part and GameRoom
    int ID { get; }
}
public interface IAbs
{
    IPart GetSomething(string name);
}

public class GameRoom : IPart
{
    public int ID { get; set; }
}

public class GameRoomManager : IAbs
{
    GameRoom part;

    #region IAbs Members

    public GameRoom GetSomething(string name)
    {
        return part;
    }


    IPart IAbs.GetSomething(string name)
    {
        return GetSomething(name);
    }

    #endregion
}

public class Player : IPart
{
    public int ID { get; set; }
}

public class PlayerManager : IAbs
{
    Player part;


    #region IAbs Members

    public Player GetSomething(string name)
    {
        return part;
    }
    IPart IAbs.GetSomething(string name)
    {
        return GetSomething(name);
    }

    #endregion
}

B计划

使用具有通用类型和接口(interface)的基类

public interface IItem
{
    // put things here that are common between Part and GameRoom
    int ID { get; }
}
public class GameRoom : IItem
{
    public int ID { get; set; }
}
public class Player : IItem
{
    public int ID { get; set; }
}


public interface IAbs
{
    IItem GetItem(string guid);
}
public abstract class Abs<T> : IAbs
    where T : IItem
{
    protected abstract T GetItem(string name);

    protected Abs(T item)
    {
        this.Item=item;
    }
    protected T Item { get; private set; }

    #region IAbs Members

    IItem IAbs.GetItem(string name)
    {
        return GetItem(name);
    }

    #endregion
}


public class GameRoomManager : Abs<GameRoom>
{
    public GameRoomManager(GameRoom room) : base(room)
    {
    }
    protected override GameRoom GetItem(string guid)
    {
        return Item;
    }
    public GameRoom GetRoom(string guid) { return GetItem(guid); }
}

public class PlayerManager : Abs<Player>
{
    public PlayerManager(Player player)
        : base(player)
    {
    }
    protected override Player GetItem(string guid)
    {
        return Item;
    }
    public Player GetPlayer(string guid) { return GetItem(guid); }
}

这里是一些示例用法:

class Program
{
    static void Main(string[] args)
    {

        List<IAbs> managers=new List<IAbs>();
        var pm=new PlayerManager(new Player() { ID=1001 });
        var gm=new GameRoomManager(new GameRoom() { ID=2050 });

        managers.Add(pm);
        managers.Add(gm);

        IItem part = managers[0].GetItem("0000");

    }
}

关于c# - 通用抽象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40184039/

相关文章:

c - 在有根树中插入(项目) - LCRS 表示

c# - Xunit 测试不适用于 mongodb 服务

c# - 使用 lambda 表达式的嵌套集合创建对象图

java - 泛型 - 使用泛型参数调用方法

Java 泛型类型删除 : when and what happens?

c# - 静态东西的松散耦合

oop - 抽象和封装之间的区别?

c# - USB 中继单元编程

c# - 为什么我应该在使用三元运算符时将十六进制值显式转换为字节?

generics - F# 使用类型变量调用内联函数