C#方法:是否有要插入的参数名称';派生类名';一般而言

本文关键字:派生 一般而言 参数 是否 方法 插入 | 更新日期: 2023-09-27 18:21:22

我想创建一个基类Student,其中包含方法changeName。我想要从基类Student派生的studentclasses,例如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 + ");
    }
}

我想知道是否可以将公共虚拟void changeName参数更改为接受Student派生类的泛型参数。

这在c#中可能吗?

(类似于以下内容:public virtual void changeName(Anyderivedclass s,string name)

C#方法:是否有要插入的参数名称';派生类名';一般而言

如果你稍微改变一下设计,事情就会变得容易得多。您似乎来自Java背景,所以让我们看看C#如何帮助改进您的代码。

首先,取FirstName/LastName字段并将其移动到基类,因为任何注册的学生都必须提供这些字段。其次,C#有一个名为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";
}

一般来说,您正在创建的对象上的任何实例方法都不应该接受它自己的类型来进行自身变异。

但是changeName()是抽象Student的一个实例方法。你为什么要把它的一个导数的实例作为它的参数之一?

为什么你需要仿制药?它应该像…一样简单

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 + ");
    }
}