我想创建一个基类Student
,其中包含方法changeName
。我希望studentclasses
派生自基类Student
,例如collegestudent
等。我希望能够更改学生的姓名。
我有这段代码:
public abstract class Student
{
public virtual void changeName(CollegeStudent s, string name)
{
s.firstName = name;
}
public abstract void outputDetails();
}
public class CollegeStudent : Student
{
public string firstName;
public string lastName;
public string major;
public double GPA;
public override void outputDetails()
{
Console.WriteLine("Student " + firstName + ");
}
}
我想知道是否可以将public virtual void changeName参数更改为接受Student的任何派生类的泛型参数。
这可能在c#中吗?
(像这样:public virtual void changeName(Anyderivedclass s,string name)
答案 0 :(得分:7)
如果你稍微改变了设计,事情会变得容易些。您好像是来自Java背景,所以让我们看看C#如何帮助您改进代码。
首先,获取FirstName / LastName字段并将它们移动到基类,因为任何注册的学生都必须提供这些字段。其次,C#有一个名为Properties的功能(具体在这里我们可以使用Auto-Implemented Properties,因为我们不需要验证),这基本上是get / set方法的语法糖。您可以重新创建学生课程,如下所示:
public abstract class Student
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
这将允许派生类的任何实例更改firstname和lastname属性,而不添加任何额外的方法:
void Main()
{
var student = new CollegeStudent();
student.FirstName = "Yuval";
}
一般来说,您创建的对象上的任何实例方法都不应该接受它自己的类型以便自我改变。
答案 1 :(得分:5)
但是changeName()是抽象学生的实例方法。你为什么要把它的一个衍生物的实例作为其中一个参数传递?
为什么需要仿制药?它应该像......一样简单。
public abstract class Student
{
public abstract void changeName(string newName);
public abstract void outputDetails();
}
public class CollegeStudent : Student
{
public string firstName;
public string lastName;
public string major;
public double GPA;
public override void changeName(string newName)
{
firstName = newName;
}
public override void outputDetails()
{
Console.WriteLine("Student " + firstName + ");
}
}
事实上(正如指出的那样)基类中存在changeName()表明名称属性属于基类,所以它应该如下......
public abstract class Student
{
public string firstName;
public string lastName;
public virtual void changeName(string newName)
{
firstName = newName;
}
public abstract void outputDetails();
}
public class CollegeStudent : Student
{
public string major;
public double GPA;
public override void outputDetails()
{
Console.WriteLine("Student " + firstName + ");
}
}