C#不能覆盖继承的成员

时间:2014-12-16 08:38:29

标签: c# object inheritance base

我正在从一本名为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;
        }
    }
}

和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

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

2 个答案:

答案 0 :(得分:14)

错误不言自明,在GradedActivity2中标记virtual函数:

public virtual char GetGrade()

来自MSDN:

  

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

答案 1 :(得分:3)

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

public virtual char GetGrade()

这只是一个故障安全机制和一个opimization,因为在派生类时不必检查派生方法的非虚方法。