C# 无法重写继承的成员

本文关键字:成员 继承 重写 | 更新日期: 2023-09-27 18:34:18

我正在从一本名为Chegwidden Gladdis的书中学习C#。我正在制作与书中编写的相同的程序和代码。但是有一个问题。我无法覆盖父类中的方法。我从章节开始就完全阅读了这本书,5 遍,每次都是一样的,但我无法弄清楚为什么我不能覆盖父类的方法。下面是基类 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;
        }
    }
}

和分级活动2.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;
        }
    }
}

和通过失败考试

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();
        }
    }
}

输出应为

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()',因为它没有标记为虚拟,抽象或覆盖"。 我完全检查了

C# 无法重写继承的成员

一种选择是在GradedActivity2中标记函数virtual

public virtual char GetGrade()

从 MSDN:

virtual 关键字用于修改方法、属性、索引器或事件声明,并允许在派生中重写它.class。例如,此方法可以由任何类重写继承它:

基类中GetGrade的方法应该告诉它允许派生,使用 virtual 关键字:

public virtual char GetGrade()

这只是一种故障安全机制和优化,因为不必在派生类中的派生方法上检查非虚拟方法。