我正在为Skyrim创建一个保存游戏管理器,并遇到了一个问题.当我自己创建一个SaveGame对象时,保存的位图部分正常工作.但是,当我在循环中调用该方法时,位图会出现一个错误的值,主要是一个类似于另一个保存游戏的值.
TL; DR - 为什么我的表单的列表框显示正确的字符保存信息,除了嵌入的图片?它不是选择正确的图片,而是选择上次处理的图片.该过程与通过打开文件对话框选择的过程有何不同?
编辑:更新 - 我查看了存储在每个SaveGame对象中的位图,发现在scanDirectoryForSaves中创建SaveGames期间会以某种方式弄乱它.是否存在使用位图的对象范围问题并使用我不知道的字节指针?
这是我的保存游戏对象的静态工厂的代码:
public string Name { get; private set; }
public int SaveNumber { get; private set; }
public int PictureWidth { get; private set; }
public int PictureHeight { get; private set; }
public Bitmap Picture { get; private set; }
public DateTime SaveDate { get; private set; }
public string FileName { get; private set; }
public static SaveGame ReadSaveGame(string Filename)
{
SaveGame save = new SaveGame();
save.FileName = Filename;
byte[] …Run Code Online (Sandbox Code Playgroud) 我使用getConstructors()方法来拉取类的构造函数.该类在一个抽象的超类引用中,我不知道在用户决定之前调用哪个子类.这是我到目前为止所拥有的.
Weapon stickCopy = stick;
System.out.println(stick);
System.out.println(stickCopy);
Class <? extends Weapon> myClass = stick.getClass( );
System.out.println(myClass.getSimpleName( ));
Constructor<?>[] construct = myClass.getConstructors( );
for(Constructor<?> constructor: construct)
{
System.out.println(constructor);
}
try
{
stickCopy = (Weapon) construct[2].newInstance((stick));
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(stick);
System.out.println(stickCopy);
Run Code Online (Sandbox Code Playgroud)
Stick类是抽象Weapon类的子类.我试图找出存储在播放器对象中的武器参考的深拷贝的代码.由于Weapon是抽象的,我无法从中调用复制构造函数.在我的Stick类中,复制构造函数是第三个构造函数,因此我将2硬编码到try语句的构造数组中.如果我通过在复制构造函数前添加新构造函数或重新排序它们来更改stick类的构造函数,如何在运行时找到复制构造函数的位置?
另外,我之前从未使用过Generics,因此,如果我没有遵循通常被认为是良好的编程习惯,请更正我.