C# 基于测试用例定义类
有人能告诉我如何定义班级学生,从而满足最后一个测试用例吗。 我无法理解上一个函数GetId()的方法实现是如何实现的C# 基于测试用例定义类,c#,unit-testing,c#-4.0,C#,Unit Testing,C# 4.0,有人能告诉我如何定义班级学生,从而满足最后一个测试用例吗。 我无法理解上一个函数GetId()的方法实现是如何实现的 谢谢我从评论中了解到您正在进行一些测试驱动开发(TDD)练习,并且您在理解这个示例时遇到了困难。考虑到这一点,以下是我的看法: 测试中发生的第一件事是,当您创建Student的实例时,它被分配给类型为User的变量。这可能有不同的方法,但最明显的解释是,User是基类,Student继承User 接下来的两条语句直接调用student变量上的方法。由于此变量的类型为User,因此
谢谢我从评论中了解到您正在进行一些测试驱动开发(TDD)练习,并且您在理解这个示例时遇到了困难。考虑到这一点,以下是我的看法:
Student
的实例时,它被分配给类型为User
的变量。这可能有不同的方法,但最明显的解释是,User
是基类,Student
继承User
student
变量上的方法。由于此变量的类型为User
,因此这些方法必须存在于User
类中。同样,有多种方法可以实际工作,但最简单的方法是假设这些方法需要返回的值实际上存储在User
类中User
类,它看起来像这样:
class User
{
private readonly string _name;
private readonly int _id;
public User(string name, int id)
{
_name = name;
_id = id;
}
public string GetName() { return _name; }
public int GetId() { return _id; }
}
上述方法确保了当我们通过类型为User
的变量查看对象实例时,我们仍然可以调用GetName()
和GetId()
方法,并返回我们期望的值
现在我们来进行该方法的第三个也是最后一个测试。请注意,在调用方法之前,此测试将student
变量强制转换为类student
。还请注意,此方法应返回studentId
中的值,而不是basicId
中的值,后者是基类的GetId()
方法应返回的值
因此,我们有相同的方法名,在相同的对象实例上使用,但根据对象的编译时类型(也称为“静态类型”),其行为应该有所不同。这与运行时类型相反,运行时类型是对象的实际类型
有鉴于此,我们必须在Student
类中声明一个新的GetId()
方法,当然还要提供一种方法让它返回在对象初始化期间使用的不同ID值:
class Student : User
{
private readonly int _id;
public Student(string name, int basicId, int studentId)
: base(name, basicId)
{
_id = studentId;
}
public new int GetId() { return _id; }
}
一个问题是,假设我们已经知道User
类有一个同名的方法,那么您将使用新的GetId()
方法隐藏该类的方法。因此,需要使用new
关键字来避免任何编译时警告
我个人的偏好是永远避免方法隐藏。它几乎总是错误的设计选择,只有在某些外部需求迫使它时才应该使用
(请注意,上述类中的字段标记为
readonly
。测试中没有要求这种情况,但测试中也没有任何内容阻止这种情况发生。我的首选是将字段设置为readonly
,除非它们不能设置为只读,因此这里使用readonly
).我从评论中了解到,您正在进行一些测试驱动开发(TDD)练习,并且您在理解此示例时遇到困难。考虑到这一点,以下是我的看法:
Student
的实例时,它被分配给类型为User
的变量。这可能有不同的方法,但最明显的解释是,User
是基类,Student
继承User
student
变量上的方法。由于此变量的类型为User
,因此这些方法必须存在于User
类中。同样,有多种方法可以实际工作,但最简单的方法是假设这些方法需要返回的值实际上存储在User
类中User
类,它看起来像这样:
class User
{
private readonly string _name;
private readonly int _id;
public User(string name, int id)
{
_name = name;
_id = id;
}
public string GetName() { return _name; }
public int GetId() { return _id; }
}
上述方法确保了当我们通过类型为User
的变量查看对象实例时,我们仍然可以调用GetName()
和GetId()
方法,并返回我们期望的值
现在我们来进行该方法的第三个也是最后一个测试。请注意,在调用方法之前,此测试将student
变量强制转换为类student
。还请注意,此方法应返回studentId
中的值,而不是basicId
中的值,后者是基类的GetId()
方法应返回的值
因此,我们有相同的方法名,在相同的对象实例上使用,但根据对象的编译时类型(也称为“静态类型”),其行为应该有所不同。这与运行时类型相反,运行时类型是对象的实际类型
有鉴于此,我们必须在Student
类中声明一个新的GetId()
方法,当然还要提供一种方法让它返回在对象初始化期间使用的不同ID值:
class Student : User
{
private readonly int _id;
public Student(string name, int basicId, int studentId)
: base(name, basicId)
{
_id = studentId;
}
public new int GetId() { return _id; }
}
一个问题是,假设我们已经知道User
类有一个同名的方法,那么您将使用新的GetId()
方法隐藏该类的方法。因此,需要使用new
关键字来避免任何编译时警告
我个人的偏好是永远避免方法隐藏。它几乎总是错误的设计选择,只有在某些外部需求迫使它时才应该使用
(请注意,上述类别中的字段标记为r。)