从接口创建通用对象

本文关键字:对象 创建 接口 | 更新日期: 2023-09-27 18:31:21

我在VS 2013中为Win Phone 8编程。

我有一个游戏课,有 2 个可观察集合:

public class Games
{
    public Games() { }
    public ObservableCollection<Game1> Games1 { get; set; }
    public ObservableCollection<Game2> Games2 { get; set; }
}

游戏1和游戏2类:

public class Game1: GameBase<PersonG1>
{
    public Game1(){}
    public string Game1Property{ get; set; }
}
public class Game2: GameBase<PersonG2>
{
    public Game2(){}
    public string Game2Property{ get; set; }
}

游戏基础类:

public abstract class GameBase<TPerson> where TPerson : Person
{
    public string GameStatus { get; set; }
    public string GameDuration { get; set; }
    public ObservableCollection<TPerson> Persons { get; set; }
}

人员类别:

public class Person
{
    public string Name { get; set; }
}
public class PersonG1: Person
{
    public string PersonG1Property{ get; set; }
}
public class PersonG2: Person
{
    public string Person2Property{ get; set; }
}

启动手机应用程序后,我将选择一个游戏,然后转到 xaml 页面,其中 DataContext = 游戏 1 或游戏 2

但是我有一个页面:MakePerson.xaml,

这个页面不知道DataContext或任何东西,我用它来为每个游戏添加人员,并且会为所有游戏使用相同的MakePerson.xaml,我去Makeperson.xaml页面如下:

 NavigationService.Navigate(new Uri(GlobalResources.MakePersonPage + "?index=" + _gameIndex.ToString() + "&pId=-1&gametype=Game1", UriKind.Relative));

其中_gameIndex表示 ObservableCollection 中游戏的索引,pID 表示 ObservableCollection Persons中的 personIndex,gt 表示游戏类型,到达 Makeperson.xaml 页面

private object currGame;
private Person currPerson;
DataContext = currentPerson;
_gameIndex = int.Parse(NavigationContext.QueryString["index"]);
_personIndex = int.Parse(NavigationContext.QueryString["pId"]);
_gameType = NavigationContext.QueryString["gametype"];
switch (_gameType)
        {
            case "Game1":
                {
                 currGame = Games.Games1[gameIndex];
                 currPerson = Games1[gameindex].Persons.ElementAt(personindex); 
                }
            case "Game2":
            currGame = Games.Games2[gameIndex]
            currPerson = Games2[gameindex].Persons.ElementAt(personindex); 
        }

如何更改此结构,以便我可以在makePerson.xaml中更舒适地工作?我想到带接口的通用?

我必须如何更改我的类,所以我总是有相同的对象,例如可能像这样:

 switch (_gameType)
        {
            case "Game1":
                IGame currGame = Games.Game1s[_gameIndex];
                currentPerson = currGame.Persons.ElementAt(persondindex);
                break;
            case "Game2":
                IGame currGame = Games.Games2[_gameIndex];
                currentPerson = currGame.Persons.ElementAt(persondindex);
                break;
            default:
                break;
        }

或者我可以使用的其他解决方案?

谢谢。(对不起,英语不好)

从接口创建通用对象

你的游戏已经继承了GameBase,所以你应该能够使用正常的多态性。因此,您的currGame类型不是"对象",而是"GameBase"类型。

GameBase currGame;
switch (_gameType)
    {
        case "Game1":
            currGame = Games.Game1s[_gameIndex];
            currentPerson = currGame.Persons.ElementAt(persondindex);
            break;
        case "Game2":
            currGame = Games.Games2[_gameIndex];
            currentPerson = currGame.Persons.ElementAt(persondindex);
            break;
        default:
            break;
    }

编辑:您不想强制转换为接口,因为它是多余的。但您可以将游戏库更改为:

public abstract class GameBase
{
    public string GameStatus { get; set; }
    public string GameDuration { get; set; }
    public ObservableCollection<Person> Persons { get; set; }
}