任务描述
大学期间,大四的课程数相对于大三的课程数会消减很多,这样学生们能够更加灵活的应用自己的时间。现制定一个课程表,标出周一到周五之间有课的日期。例如:
周一 有
周二 有
周三 无
周四 无
周五 有
根据编程要求,编写一个课表类,使之能够反映每天的课程安排。
相关知识
this
this关键字表示引用当前类实例。
用法一
this关键字用来限定和区分成员的相似名称。比如当我们编写类的成员函数的时候,函数传参名称通常与成员变量类型相对应,命名可能会有些混淆,例如:
class Person
{
private string name;
private int age;
//声明函数setAttribute(),用来更新类成员变量
//传参命名与成员变量类似
public void setAttribute(string name, int age){
name = name; //易混淆或无法区分成员变量和传参
age = age;
}
}
使用this区分:
class Person
{
private string name;
private int age;
//声明函数setAttribute(),用来更新类成员变量
//传参命名与成员变量类似
public void setAttribute(string name, int age){
this.name = name; //第一个name,表示类成员,第二个表示参数变量
this.age = age;
}
}
其中参数也可命名其他相似的名称,例如前面加个下划线_,此时this可省略:
public void setAttribute(string _name, int _age);
用法二
替代对象作为参数传递给其他方法。
如下面这段代码:
namespace J4
{
class Person //第一个类Person
{
private string name; //两个属性name和age
private int age;
public void setName(string name) //传参string类型
{
this.name = name;
}
public void setName(WhitePerson wp) //传参为WhitePerson类对象,使用对象属性更新namg成员
{
this.name = wp.getName();
}
}
class WhitePerson //第二个类WhitePerson
{
private string name; //不同属性name个height
private int height;
public string getName()
{
return name;
}
public void setName(string name)
{
this.name = name;
}
public void setHeight(int height)
{
this.height = height;
}
public Person getPerson() //初始化WhitePerson对象后,使用该对象属性对Person类对象进行初始化
{
Person pTemp = new Person();
pTemp.setName(this); //传入this,作为对象
return pTemp;
}
}
class myCaller //第三个调用类myCaller
{
public static void Main(string[] agrs)
{
Person p = new Person();
WhitePerson wp = new WhitePerson(); //创建并初始化WhitePerson对象
wp.setName("Jackie");
wp.setHeight(177);
p = wp.getPerson(); //直接返回Person对象
}
}
}
此段代码执行过程如下:
在myCaller类中静态函数Main()方法下,创建一个Person类型实例,Person实例p属性值未初始化;
创建一个WhitePerson类实例wp
类实例wp调用成员函数setName(),初始化wp的name属性
类实例wp调用成员函数setHeight(),初始化wp的height属性
wp调用getPerson()函数,在此函数中,创建一个临时Person实例pTemp,pTemp调用Person成员函数setName(),参数为WhitePerson对象;
在函数setName()中,使用WhitePerson对象的name属性初始化pTemp的name属性
getPeron()返回已初始化好的pTemp对象,并赋给Person实例p。
以后我们可能会经常遇见只使用某实例的某几个属性,这时,this作为替代对象进行传参。
用法三
this声明索引器。this可像数组一样使用索引对类成员变量进行操作。结构如下:
public int this[int index]{
get { return array[index];}
set { array[index] = value}
}
其中array[index]表示索引为index的成员变量,set和get分别为成员变量赋值和获取成员变量值。返回值为int类型,表明操作的类成员必须为int类型。value是关键字。
具体实例如下:
namespace J4
{
class Person {
string name; //声明三个同类型成员
string country;
string city;
public string this[int index]{ //使用this声明索引器,返回值为string类型
set {
switch(index){
case 0: //设置name值,以此类推
this.name = value;
break;
case 1:
this.country = value;
break;
case 2:
this.city = value;
break;
default:
throw new ArgumentOutOfRangeException(); //索引越界
}
}
}
//显示是否设置成功
public void saying() {
Console.WriteLine("my name is " + name + ", I come from " + city + ", " + country);
}
}
class myCaller {
public static void Main(string[] args)
{
Person p = new Person();
//直接使用索引对成员变量操作
p[0] = "Jackie"; //name
p[1] = "China"; //country
p[2] = "Beijing"; //city
p.saying();
}
}
此段代码定义了Person类,类有三个成员变量,均为string类型,所以可使用this创建索引器:
public string this[int index];
在索引器中,我们根据索引值index,通过switch…case结构进行区分赋值。
switch(index){
case 0:
//...
break;
case 1:
//...
//...
}
定义完成后,我们在调用类中直接使用索引操作成员变量:
p[0] = "Jackie"; //name
p[1] = "China"; //country
p[2] = "Beijing"; //city
编程要求
本关的编程任务是补全右侧代码片段中Begin至End中间的代码,具体要求如下:
使用this声明索引器,补全课表类Schedule
打印结果,程序正常运行
测试说明
测试过程:
平台将编译用户补全后代码,并根据程序的输出判断程序是否正确。
以下是测试样例:
测试输入:
预期输出:
Monday:True
Tuesday:True
Wednesday:False
Thursday:False
Friday:True
我的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace J4
{
class Schedule
{
bool Monday;
bool Tuesday;
bool Wednesday;
bool Thursday;
bool Friday;
/********** Begin *********/
//使用this索引器补全代码
public bool this[int index]
{ //使用this声明索引器,返回值为string类型
set
{
switch (index)
{
case 1: //设置name值,以此类推
this.Monday = value;
break;
case 2:
this.Tuesday = value;
break;
case 3:
this.Wednesday = value;
break;
case 4:
this.Thursday = value;
break;
case 5:
this.Friday = value;
break;
default:
throw new ArgumentOutOfRangeException(); //索引越界
}
}
}
/********** End *********/
public void getResult()
{
Console.WriteLine("Monday:" + Monday);
Console.WriteLine("Tuesday:" + Tuesday);
Console.WriteLine("Wednesday:" + Wednesday);
Console.WriteLine("Thursday:" + Thursday);
Console.WriteLine("Friday:" + Friday);
}
}
class myCaller
{
public static void Main(string[] args)
{
Schedule s = new Schedule();
s[1] = true;
s[2] = true;
s[3] = false;
s[4] = false;
s[5] = true;
s.getResult();
}
}
}
链接
链接: link.