如何制作我的 Arithmetic Class 模块化 c# CLI 程序
How to make my Arithmetic Class Modular c# CLI Program
背景:
大家好,我现在正在学习软件设计课程,对此我很困惑。
我决定编写一个程序,以便复习 class:class 交互的基础知识,我现在有两个 classes,一个 Arithmetic Class,其中包含一些非常multiply()
、addition()
等简单方法
和我的主 class,它包含一个通过 case 语句的 CLI 菜单。
我想做的是使我的算术 class 模块化。
我的 ResultGen()
和 randomNumberGen()
方法包含 Console.WriteLine
,如果可能的话,我不希望这个 Arithmetic class 必须依赖于控制台 Class 存在(因为我想很快将此算术 class 与 GUI WPF 程序一起使用)
我的问题是,
如何将 month
和 year
变量从我的 randomNumberGen()
方法转移到我的主要 Program()
class 以便我可以格式化它们在那里,我如何将 ResultGen()
中的 result
变量也带过来?
我最好使用参数或 getter 和 setter 来解决这个问题,而不是 returns。
public int ResultGen()
{
Console.WriteLine("Result is equal to: " + result + ".");
return result;
}
public void randomNumberGen()
{
Random rnd = new Random();
month = rnd.Next(1, 11); // creates a number between 1 and 12
year = rnd.Next(1, 21); // creates a number between 1 and 51
Console.WriteLine("Month: " + month);
Console.WriteLine("Year: " + year);
}
这是我的主程序:
class Program
{
static void Main(string[] args)
{
ProgramMenu();
}
static void ProgramMenu()
{
ConsoleKeyInfo cki;
Arithmetic math = new Arithmetic();
math.randomNumberGen();
Console.WriteLine("Press '1' for addition or '2' for multiplication, press '3 'to generate results");
do
{
cki = Console.ReadKey(false); // show the key as you read it
switch (cki.KeyChar.ToString())
{
case "1":
{
math.addition();
math.ResultGen();
break;
}
case "2":
{
math.multipy();
math.ResultGen();
break;
}
case "3":
{
math.randomNumberGen();
break;
}
}
} while (cki.Key != ConsoleKey.Escape);
}
}
感谢你们提供的任何帮助,但请记住,我是一名新手程序员,只是想了解基本实践。
如果我尝试这样做,我可能会使用 toString() 方法,但我已经尝试过但失败了。
使用元组
对于第一种方法,只需删除 Console.WriteLine
调用并在处理输出的应用程序中执行。
对于第二个你需要return两个变量在这种情况下会建议returning一个元组。
将您的 randomNumberGen 的 return 类型更改为 Tuple<int,int>
双元组的类型,两个成员的类型都是整数,因此您的方法签名应该是
public Tuple<int,int> randomNumberGen()
您应该从两个变量(月和年)创建元组,同样有几种方法可以做到这一点,最简单的方法是使用开始 Tuple.Create
因此您的 return 语句应该如下所示 return Tuple.Create(month,year)
在调用方端删除变量,您可以首先调用 Item1
属性,然后调用 Item2
属性。
您的方法应该如下所示
public Tuple<int,int> RandomNumberGen()
{
Random rnd = new Random();
int month = rnd.Next(1, 11); // creates a number between 1 and 12
int year = rnd.Next(1, 21); // creates a number between 1 and 51
return Tuple.Create(month,year);
}
在你的主
var result = math.randomNumberGen();
var month = result.Item1;
var year = result.Item2;
现在您可以随心所欲地处理月份和年份。
设计笔记
知道这不是您问题的一部分,但仅供参考,通常用于命名 public C# 中面向成员的惯例是大驼峰式,本地人是小驼峰式
属性(在这种情况下没有意义)
您可以在该属性可见的任何上下文中设置属性 setter,即 属性,在这种情况下 这样做毫无意义:
在你的 class
public int Month{ get; private set;}
public int Year { get; private set; }
public void RandomNumberGen()
{
Random rnd = new Random();
Month = rnd.Next(1, 11); // creates a number between 1 and 12
Year = rnd.Next(1, 21); // creates a number between 1 and 51
}
而在你的主要
var custGenVarName = new Arithmetic();
custGenVarName.RandomNumberGen();
int month = custGenVarName.Month;
int year = custGenVarName.Year;
在这种情况下没有意义,因为计算结果不应该存在于要进行计算的对象中,应该进行计算并return给调用者
背景:
大家好,我现在正在学习软件设计课程,对此我很困惑。
我决定编写一个程序,以便复习 class:class 交互的基础知识,我现在有两个 classes,一个 Arithmetic Class,其中包含一些非常multiply()
、addition()
等简单方法
和我的主 class,它包含一个通过 case 语句的 CLI 菜单。
我想做的是使我的算术 class 模块化。
我的 ResultGen()
和 randomNumberGen()
方法包含 Console.WriteLine
,如果可能的话,我不希望这个 Arithmetic class 必须依赖于控制台 Class 存在(因为我想很快将此算术 class 与 GUI WPF 程序一起使用)
我的问题是,
如何将 month
和 year
变量从我的 randomNumberGen()
方法转移到我的主要 Program()
class 以便我可以格式化它们在那里,我如何将 ResultGen()
中的 result
变量也带过来?
我最好使用参数或 getter 和 setter 来解决这个问题,而不是 returns。
public int ResultGen()
{
Console.WriteLine("Result is equal to: " + result + ".");
return result;
}
public void randomNumberGen()
{
Random rnd = new Random();
month = rnd.Next(1, 11); // creates a number between 1 and 12
year = rnd.Next(1, 21); // creates a number between 1 and 51
Console.WriteLine("Month: " + month);
Console.WriteLine("Year: " + year);
}
这是我的主程序:
class Program
{
static void Main(string[] args)
{
ProgramMenu();
}
static void ProgramMenu()
{
ConsoleKeyInfo cki;
Arithmetic math = new Arithmetic();
math.randomNumberGen();
Console.WriteLine("Press '1' for addition or '2' for multiplication, press '3 'to generate results");
do
{
cki = Console.ReadKey(false); // show the key as you read it
switch (cki.KeyChar.ToString())
{
case "1":
{
math.addition();
math.ResultGen();
break;
}
case "2":
{
math.multipy();
math.ResultGen();
break;
}
case "3":
{
math.randomNumberGen();
break;
}
}
} while (cki.Key != ConsoleKey.Escape);
}
}
感谢你们提供的任何帮助,但请记住,我是一名新手程序员,只是想了解基本实践。
如果我尝试这样做,我可能会使用 toString() 方法,但我已经尝试过但失败了。
使用元组
对于第一种方法,只需删除 Console.WriteLine
调用并在处理输出的应用程序中执行。
对于第二个你需要return两个变量在这种情况下会建议returning一个元组。
将您的 randomNumberGen 的 return 类型更改为 Tuple<int,int>
双元组的类型,两个成员的类型都是整数,因此您的方法签名应该是
public Tuple<int,int> randomNumberGen()
您应该从两个变量(月和年)创建元组,同样有几种方法可以做到这一点,最简单的方法是使用开始 Tuple.Create
因此您的 return 语句应该如下所示 return Tuple.Create(month,year)
在调用方端删除变量,您可以首先调用 Item1
属性,然后调用 Item2
属性。
您的方法应该如下所示
public Tuple<int,int> RandomNumberGen()
{
Random rnd = new Random();
int month = rnd.Next(1, 11); // creates a number between 1 and 12
int year = rnd.Next(1, 21); // creates a number between 1 and 51
return Tuple.Create(month,year);
}
在你的主
var result = math.randomNumberGen();
var month = result.Item1;
var year = result.Item2;
现在您可以随心所欲地处理月份和年份。
设计笔记
知道这不是您问题的一部分,但仅供参考,通常用于命名 public C# 中面向成员的惯例是大驼峰式,本地人是小驼峰式
属性(在这种情况下没有意义)
您可以在该属性可见的任何上下文中设置属性 setter,即 属性,在这种情况下 这样做毫无意义:
在你的 class
public int Month{ get; private set;}
public int Year { get; private set; }
public void RandomNumberGen()
{
Random rnd = new Random();
Month = rnd.Next(1, 11); // creates a number between 1 and 12
Year = rnd.Next(1, 21); // creates a number between 1 and 51
}
而在你的主要
var custGenVarName = new Arithmetic();
custGenVarName.RandomNumberGen();
int month = custGenVarName.Month;
int year = custGenVarName.Year;
在这种情况下没有意义,因为计算结果不应该存在于要进行计算的对象中,应该进行计算并return给调用者