从接口创建通用对象
本文关键字:对象 创建 接口 | 更新日期: 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; }
}