出于某种原因,我似乎无法使用NoMoreWords
从班级checkSpell
中更改班级manageWords
中的媒体资源Get/Set
的值。
完整的代码如下,但重要的一点在这里。
在checkSpell
中有一个名为NoMoreWords
的bool属性。
然后,我在checkSpell
中创建manageWords
对象的实例,并将属性NoMoreWords
更改为true。我的观察窗口证明manageWords
中的值已更改,但一旦我回到checkSpell
,NoMoreWords
仍为假。
你能发现问题并指出正确的方向吗?感谢。
这是checkSpell
class checkSpell
{
public bool finished = false;
public bool NoMoreWords { get; set; }
public void getWord()
{
manageWords mngit = new manageWords();
speakIt spk = new speakIt();
do
{
string word = mngit.readFile(); // Open the file and gets the word
if (NoMoreWords == true)
{
Console.WriteLine("NoMoreWords is TRUE");
break;
}
//if (word == string.Empty) break;
Console.WriteLine();
Console.WriteLine("Write the word: {0}", word.ToUpper());
//spk.sayThis("Write the word: " + word);
Console.Write(">");
char[] a = word.ToCharArray(); //Converts string into chars
getLetter(a); // METHOD
// if (finished == true) break;
System.Threading.Thread.Sleep(30);
//spk.sayThis("Correct!");
Console.WriteLine("");
} while (!finished);
Console.WriteLine("XXXX Bye Bye");
spk.sayThis("Bye Bye");
}
/************************************************************************************************************************
* Goes through the word (as a char[]) and compare with the typed letters *
************************************************************************************************************************/
public void getLetter(char[] a)
{
int b = 0;
ConsoleKeyInfo k;
ConsoleColor orig = Console.ForegroundColor;
int CL = Console.CursorLeft;
int CT = Console.CursorTop;
string capOut = "";
for (int i = b; i < a.Length; i = +b)
{
k = Console.ReadKey(true);
if (k.Key == ConsoleKey.Escape)
{
finished = true;
break;
}
if (k.KeyChar == a[i])
{
Console.ForegroundColor = orig;
capOut = k.KeyChar.ToString().ToUpper();
Console.Write(k.KeyChar.ToString().ToUpper());
b++;
CL = Console.CursorLeft; //Get the cursor position of the last correct letter
CT = Console.CursorTop;
}
else if (k.Key == ConsoleKey.Backspace)
{
if (Console.CursorLeft > CL) Console.SetCursorPosition(Console.CursorLeft - 1, CT);
ConsoleColor bg = Console.BackgroundColor;
Console.ForegroundColor = bg;
Console.Write(" ");
Console.CursorLeft = Console.CursorLeft - 1;
}
else if (k.Key == ConsoleKey.Enter)
{
// i don't want to change line
}
else
{
Console.ForegroundColor = ConsoleColor.Red;
Console.Write(k.KeyChar.ToString().ToUpper());
Console.ForegroundColor = orig;
}
}
}
现在manageWords
class manageWords // Check file, open and edit it
{
public int lineNumber;
//Check if file exists
public string readFile()
{
string CurrentLine = "";
int count = 0;
checkSpell ckt = new checkSpell();
try
{
START:
count = File.ReadLines(Path.Combine(Environment.CurrentDirectory, "words.txt")).Count(); // Gets number of lines
var lines = File.ReadLines(Path.Combine(Environment.CurrentDirectory, "words.txt"));
if (lineNumber < count)
{
CurrentLine = lines.Skip(lineNumber).First();
lineNumber++;
}
else
{
ckt.NoMoreWords = true;
Console.WriteLine("");
Console.WriteLine("Do you want to play it again? Yes/No: ");
if (Console.ReadLine() == "yes")
{
lineNumber = 0;
goto START;
}
else ckt.NoMoreWords = true;
}
}
catch (Exception e)
{
// Let the user know what went wrong.
Console.WriteLine("The file could not be read:");
Console.WriteLine(e.Message);
// Console.ReadLine();
}
return CurrentLine;
}
}
答案 0 :(得分:1)
这里的原因是你有两个checkSpell
个实例。
checkSpell
的getWord方法是一种实例方法,因此它可以访问的NoMoreWords
属性实例manageWords
类型的新对象并调用readFile
manageWords.readFile
构建另一个checkSpell
实例,此实例使NoMoreWords
成为true
原始实例,即您调用getWord
的实例,没有更改。
也许您应该将原始实例传递给readFile
方法,而不是让该方法构造一个新的checkSpell
对象实例?
基本上改变你的readFile方法如下:
public string readFile(checkSpell ckt)
然后在调用readFile时传入checkSpell实例:
string word = mngit.readFile(this);
另外请记住删除构建新readFile
实例的checkSpell
中的行,无论如何你都必须这样做,因为你不能同时拥有ckt
参数和一个局部变量。
答案 1 :(得分:0)
你的设计有缺陷。
您有checkSpell
个班级创建manageWords
的实例,并在manageWords.readFile()
内调用checkSpell.getWord()
。问题是您的manageWords.readFile()
正在创建checkSpell
的新实例。
它永远不会与您正在观察或期待的实例进行交互。
您可以执行以下操作作为快速入侵,可以满足您的需求,但可能对整个程序的结构无效。
更改manageWords.readFile()
以接收checkSpell
的实例并使用该实例而不是创建新实例。
public string readFile(checkSpell chkSpell)
{
string CurrentLine = "";
int count = 0;
try
{
....
if (lineNumber < count)
{
CurrentLine = lines.Skip(lineNumber).First();
lineNumber++;
}
else
{
chkSpell.NoMoreWords = true;
....
}
....
}
....
}
然后从checkSpell.getWord()
致电你的readFile()
:mngit.readFile(this);
答案 2 :(得分:0)
因为manageWords.readFile在自己的本地checkSpell对象(ckt)中创建,所以对此本地对象的任何更改都不会影响调用manageWords.readFile的checkSpell对象。您应该将调用者传递给manageWords.readFile,例如,
public void getWord()
{
manageWords mngit = new manageWords();
speakIt spk = new speakIt();
do
{
string word = mngit.readFile(this); // pass local checkSpell
// etc
class manageWords // Check file, open and edit it
{
public int lineNumber;
//Check if file exists
public string readFile(checkSpell ckt)
{
string CurrentLine = "";
int count = 0;
// etc
您还可以将checkSpell对象传递给manageWords构造函数并存储在manageWords中的字段中:
public void getWord()
{
manageWords mngit = new manageWords(this); // pass local checkSpell
speakIt spk = new speakIt();
do
{
string word = mngit.readFile(); // pass local checkSpell
// etc
class manageWords // Check file, open and edit it
{
public int lineNumber;
private checkSpell ckt;
public manageWords(checkSpell)
{
ckt = checkSpell;
}
//Check if file exists
public string readFile()
{
// etc