Как я могу назвать методы трех отдельных классов? - PullRequest
0 голосов
/ 29 марта 2020

У меня есть класс с именем 'Степень'

У него есть метод с именем ' getDegree () ', который печатает «Я получил степень»

Класс 'Степень' также имеет два подкласса: 'Бакалавриат' и 'Аспирант'

Каждый имеет метод 'getDegree ()' , который печатает "Я студент" и "Я аспирант" соответственно.

Я хочу знать, как вызвать метод 'getDegree ()' , создав отдельные объекты для каждого из трех классов.

Вот мой код ...

class Program
{
    class Degree
    {
        static void getDegree()
        {
            Console.WriteLine("I got a degree");               
        }

        class Undergraduate
        {
            static void getDegree()
            {
                Console.WriteLine("I am an Undergraduate");
            }

        }

        class Postgraduate
        {
            static void getDegree()
            {
                Console.WriteLine("I am a Postgraduate");
            }

        }
    }
}

static void Main(string[] args)
{
    Degree.x;
    Undergraduate.y;
    Postgraduate.z;

    x.getDegree();
    y.getDegree();
    z.getDegree();

    Console.ReadLine();
}

Ответы [ 3 ]

3 голосов
/ 29 марта 2020

Вы должны немного прочитать об объектно-ориентированных концепциях программирования.

То, что вы называете подклассом, на самом деле не подкласс, а вложенный класс. Чтобы сделать подклассы Undergraduate и Postgraduate классов Degree, вы хотите сделать что-то вроде этого:

class Degree {}
class Undergraduate : Degree {}
class Postgraduate : Degree {}

Это первая часть.

Итак, вы хотите рассматривать бакалавриата и магистратуры как степени. Вы определите метод getDegree как виртуальный. (Кстати, я предлагаю вам следовать C# Руководству по стилю [msdn] , [github] и написать его в PascalCase -> GetDegree).

Затем в ваших классах вы можете override метод и предоставить собственную реализацию для каждого подкласса. Таким образом, ваши классы могут выглядеть так:

public class Degree 
{
    public virtual string GetDegree()
    {
        return "I am a degree";
    }
}

public class Undergraduate : Degree 
{
    public override string GetDegree()
    {
        return "I am an undergrad";
    }
}

public class Postgraduate : Degree 
{
    public override string GetDegree()
    {
        return "I am a postgrad";
    }
}

Наконец, вы можете объявить объекты и все они одного типа (градусы):

Degree d1 = new Degree();
Degree d2 = new Undergraduate();
Degree d3 = new Postgraduate();

d1.GetDegree();
d2.GetDegree();
d3.GetDegree();
1 голос
/ 29 марта 2020

Ваш синтаксис неверен. Должно быть:

Degree x = new Degree();
Degree.Undergraduate y = new Degree.Undergraduate();
Degree.Postgraduate z = new Degree.Postgraduate();

x.getDegree();
y.getDegree();
z.getDegree();

Обратите внимание, что вы вложили Undergraduate и Postgraduate внутрь Degree, что немного необычно.

Обратите внимание, что Main должно быть внутри Program

Также, как и в комментарии выше, static следует удалить.

Кроме того, методы должны быть объявлены как public.

В полном объеме :

using System;

class Program
{
    class Degree
    {
        public void getDegree()
        {
            Console.WriteLine("I got a degree");
        }

        public class Undergraduate
        {
            public void getDegree()
            {
                Console.WriteLine("I am an Undergraduate");
            }

        }

        public class Postgraduate
        {
            public void getDegree()
            {
                Console.WriteLine("I am a Postgraduate");
            }

        }
    }

    static void Main(string[] args)
    {
        Degree x = new Degree();
        Degree.Undergraduate y = new Degree.Undergraduate();
        Degree.Postgraduate z = new Degree.Postgraduate();

        x.getDegree();
        y.getDegree();
        z.getDegree();

        Console.ReadLine();
    }
}
0 голосов
/ 29 марта 2020

Здесь есть некоторая путаница по поводу наследования.

Простым тестом на правильность наследования являются отношения типа «это своего рода». Если мы можем разумно сказать «Кошка - это вид млекопитающего», то у нас, вероятно, все в порядке наследования (хотя существуют гораздо более тщательные тесты).

Итак, мы можем сказать: «Бакалавриат - это своего рода степень». ?

Хитрый. Это зависит от того, что мы подразумеваем под Бакалавриатом. Это человек или тип степени? Непонятно из названия класса, но getDegree() предполагает, что это человек: «Я бакалавр».

Подводя итог, я бы сказал:

'Студент является своего рода Студент '

' A BS c. это своего рода степень '

Кажется суетливым, но эти вещи оборачиваются, чтобы укусить вас в долгосрочной перспективе, если вы поймете их неправильно.

...