C#不能覆盖继承的成员
我正在学习从命名Chegwidden Gladdis书C#。我在做相同的程序和书上写的相同的代码。但是有一个问题。我不能覆盖从父类的方法。我已经完全从readed章,5次开始的书,everyhing是一样的,但我想不通,为什么我不能不能覆盖从父类的方法。下面是从基类PassFailActivity.cs
I'm learning C# from a book named Chegwidden Gladdis. I'm making the same program and same code as written in the book. but there is a problem. i can't override a method from a parent class. I had fully readed the book from the start of chapter, 5 times, everyhing is the same but I can't figure out why I can't can't override a method from a parent class. Here's the code from the base class PassFailActivity.cs
using System;
namespace ProtectedMembers
{
public class PassFailActivity : GradedActivity2
{
private double minPassingScore; // Minimum passing score
/// <summary>
/// The constructor sets the minimum passing score
/// </summary>
/// <param name="mps">The minimum passing score.</param>
public PassFailActivity(double mps)
{
minPassingScore = mps;
}
/// <summary>
/// The GetGrade method returns a letter grade determined
/// from the score field. This methos overrides the base class method.
/// </summary>
/// <returns>The letter grade</returns>
public override char GetGrade()
{
char letterGrade;
if (base.GetScore() >= minPassingScore)
letterGrade = 'P';
else
letterGrade = 'F';
return letterGrade;
}
}
}
和GradedActivity2.cs
and GradedActivity2.cs
using System;
namespace ProtectedMembers
{
public class GradedActivity2
{
protected double score; // Numberic score
/// <summary>
/// The SetScore method sets the score field.
/// </summary>
/// <param name="s">The value to store in score</param>
public void SetScore(double s)
{
score = s;
}
/// <summary>
/// The GetScore method returns the score.
/// </summary>
/// <returns>The value stored in the score field</returns>
public double GetScore()
{
return score;
}
/// <summary>
/// The GetGrade method returns a letter grade determined from the score field.
/// </summary>
/// <returns>Return the letter grade</returns>
public char GetGrade()
{
char letterGrade;
if (score >= 90)
letterGrade = 'A';
else if (score >= 80)
letterGrade = 'B';
else if (score >= 70)
letterGrade = 'C';
else if (score >= 60)
letterGrade = 'D';
else
letterGrade = 'F';
return letterGrade;
}
}
}
和PassFailExam
and PassFailExam
using System;
namespace ProtectedMembers
{
public class PassFailExam : PassFailActivity
{
private int numQuestions; // Number of questions
private double pointsEach; // Points for each question
private int numMissed; // Number of questions missed
/// <summary>
/// The constructor sets the number of questions, the number
/// of questions missed, and the minimum passing score.
/// </summary>
/// <param name="questions">The number of questions</param>
/// <param name="missed">The number of questions missed</param>
/// <param name="minPassing">The minimum passing score</param>
public PassFailExam(int questions, int missed, double minPassing) : base(minPassing)
{
// Declare a local variable for the score.
double numericScore;
// Set the numQuestions and numMissed fields.
numQuestions = questions;
numMissed = missed;
// Calculate the points for each questions and the numeric score for this exam.
pointsEach = 100.0 / questions;
numericScore = 100.0 - (missed * pointsEach);
// Call the base class's SetScore method to set the mumeric score.
SetScore(numericScore);
}
/// <summary>
/// The GetpointsEach method returns the number of points each questions is worth
/// </summary>
/// <returns>The value in the pointsEach field</returns>
public double GetPointsEach()
{
return pointsEach;
}
/// <summary>
/// The GetNumMissed method returns the number of questions missed
/// </summary>
/// <returns>The value in the numMissed field</returns>
public int GetNumMissed()
{
return numMissed;
}
}
}
和这里是我的主
using System;
namespace ProtectedMembers
{
public class PassFailExamDemo
{
public static void Main111()
{
int questions, // Number of questions
missed; // Number of questions missed
double minPassing; // Minmum passing score
// Get the number of questions on the exam
Console.Write("How many questions are " + "on the exam? ");
questions = Convert.ToInt32(Console.ReadLine());
// Get the number of questions missed.
Console.Write("How many questions did " + "the student miss? ");
missed = Convert.ToInt32(Console.ReadLine());
// Get the minimum passing score
Console.Write("What is the minimum " + "passing score? ");
minPassing = Convert.ToInt32(Console.ReadLine());
// Create a PassFailExam project
PassFailExam exam = new PassFailExam(questions, missed, minPassing);
// Display the teset results.
Console.WriteLine("Each questions counts {0} points.",
exam.GetPointsEach());
Console.WriteLine("The exam score is {0} ",
exam.GetScore());
Console.WriteLine("The exam grade is {0} ",
exam.GetGrade());
Console.ReadLine();
}
}
}
输出应该是
the output should be
How many questions are on the exam? 100
How many questions did the student miss? 25
What is the minimum passing score? 60
Each question counts 1 points.
The exam score is 75
The exam grade is P
我曾尝试使基虚拟方法,并试图覆盖它,这只是让我这个错误'ProtectedMembers.PassFailActivity.GetGrade()调用时覆盖:不能覆盖继承成员ProtectedMembers.GradedActivity2.GetGrade()',因为它没有标记虚拟,抽象或覆盖。我全面检查
I have tried to make the base method virtual and calling override when trying to override it and that just gets me this error "'ProtectedMembers.PassFailActivity.GetGrade()': cannot override inherited member 'ProtectedMembers.GradedActivity2.GetGrade()' because it is not marked virtual, abstract, or override". i fully checked
该错误是不言自明,标志着该函数的 虚拟
在 GradedActivity2
:
The error is self-explanatory, mark the function virtual
in GradedActivity2
:
public virtual char GetGrade()
从MSDN:
虚拟关键字用于修改的方法,属性,索引,或者
事件的声明,并允许它在派生
类重写。
The virtual keyword is used to modify a method, property, indexer, or event declaration and allow for it to be overridden in a derived class. For example, this method can be overridden by any class that inherits it: