【问题标题】:How do I call the methods of three separate classes?如何调用三个独立类的方法?
【发布时间】:2020-03-29 09:22:07
【问题描述】:

我有一门课叫'Degree'

它有一个名为“getDegree()”的方法,可以打印“I got a degree”

'Degree'类还有两个子类,分别名为'Undergraduate''Postgraduate'

每个都有一个'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();
}

【问题讨论】:

  • 也许你只需要将方法从static更改为public,然后使用new创建实例并调用方法。
  • 你有两个“子类”。你没有。你有两个“嵌套类”。如果你想要子类,那么你想要继承它们,而不是嵌套它们。

标签: c# class object methods


【解决方案1】:

您应该阅读一点面向对象的编程概念。

您所说的子类并不是真正的子类,而是嵌套类。要使UndergraduatePostgraduate 类成为Degree 的子类,您需要执行以下操作:

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

这是第一部分。

所以现在您想将本科和研究生视为学位。您将 getDegree 方法定义为虚拟方法。 (顺便说一句,我建议你遵循 C# Style Guide [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):

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

d1.GetDegree();
d2.GetDegree();
d3.GetDegree();

【讨论】:

    【解决方案2】:

    你的语法是错误的。应该是:

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

    请注意,您已将 UndergraduatePostgraduate 嵌套在 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();
        }
    }
    

    【讨论】:

    • 请解决 OP 提出的问题 - 并同时展示您的课程版本。
    • @Enigmativity '我想知道如何通过为每三个类创建单独的对象来调用 'getDegree()' 方法。'我怎么不回答问题?
    • 我建议你解释一下 OP 对他现有的代码做错了什么,并解释修复它的各种方法。你已经给出了我能想到的两个直接的之一。而且您错过了 OP 实际上可能尝试做的事情 - 即使用继承。
    • 我不是在批评,只是想帮助您为 OP 找到一个好的答案。
    • 这可能是我在这里的错误。我认为创建子类和嵌套基本上是一回事。这就是我最终嵌套它们的原因。 Jasper,@Enigmativity,我非常感谢您在这里的指导。你的两个回答都帮助我清楚地认识到我的错误。现在我知道如何创建子类并通过对象调用方法,无论是子类还是嵌套对象!多谢你们! :)
    【解决方案3】:

    这里的继承有些混乱。

    对继承正确性的一个简单测试是“是一种”关系。如果我们可以合理地说“猫是一种哺乳动物”,那么我们的遗传可能还不错(尽管有更彻底的测试)。

    那么我们可以说“本科是一种学位”吗?

    棘手。这取决于我们所说的本科。是个人还是某种学位?从班级名称看不清楚,但getDegree() 表明这是个人:'我是本科生'。

    总结一下:

    “本科生是一种学生”

    '学士学位。是一种度数'

    看起来很挑剔,但如果你弄错了,这些东西从长远来看会反过来咬你。

    【讨论】:

    • 我喜欢你用这个去哪里。当您可以将其放在一个答案中时,为什么要创建一个新答案?看来你的论点很好。
    • 是的,我总是想知道多个答案,但它们是在完全不同的问题中解决的。一个是简单的语法,这个是OOD。两者之间实际上没有任何相互关系。
    • 我会选择一个答案并讲一个故事。将 OP 从他们所在的地方带到他们应该在的地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多