C # cannot override an inherited element

I am learning C # from a book called Chegwidden Gladdis. I am doing the same program and the same code as in the book. but there is a problem. I cannot override the method from the parent class. I have completely read the book from the beginning of the chapter, 5 times, everything is the same, but I cannot figure out why I cannot override the method from the 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;
        }
    }
}

      

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

      

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

      

and here is my main

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

      

I tried to make the base method virtual and invoking an override when trying to override it and it just throws me this error "ProtectedMembers.PassFailActivity.GetGrade ()": Can't override inherited element "ProtectedMembers.GradedActivity2.GetGrade () 'because it is not marked as virtual, abstract, or overridden. " I fully checked

+3


source to share


2 answers


The error is self-explanatory, mark the function virtual

in GradedActivity2

:

public virtual char GetGrade()

      



From MSDN:

The virtual keyword is used to modify a method, property, indexer, or event declaration and allow it to be overridden in a derived class. For example, this method can be overridden by any class that inherits from it:

+11


source


Your method GetGrade

in the base class should say what it allows you to get using the virtual

keyword:

public virtual char GetGrade()

      



This is just a crash protection and opimization mechanism, since non-invariant methods do not need to be checked on derived methods when getting classes.

+3


source







All Articles