C#方法:是否有一个参数名称一般插入'派生类名'?

Vik*_*ing 5 c#

我想StudentchangeName它内部的方法创建一个基类.我想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 + ");
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以将public virtual void changeName参数更改为接受Student的任何派生类的泛型参数.

这可能在c#中吗?

(像这样:public virtual void changeName(Anyderivedclass s,string name)

Yuv*_*kov 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; }
}
Run Code Online (Sandbox Code Playgroud)

这将允许派生类的任何实例更改firstname和lastname属性,而无需添加任何额外的方法:

void Main()
{
    var student = new CollegeStudent();
    student.FirstName = "Yuval";
}
Run Code Online (Sandbox Code Playgroud)

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


Mat*_*att 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 + ");
    }
}
Run Code Online (Sandbox Code Playgroud)

事实上(正如所指出的)基类中存在changeName()表明name属性属于基类,所以它应该如下......

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 + ");
    }
}
Run Code Online (Sandbox Code Playgroud)