【问题标题】:Clarification on C# OOP关于 C# OOP 的说明
【发布时间】:2015-01-07 14:19:31
【问题描述】:

我们被分配了一个任务来构造面向对象的类,基本上只看一个在 main 方法中运行的测试器类。

using System;
using school; 

namespace testschool{

public class Tester {
   static void Main(){ 
    Faculty scienceFac=University.createFaculty("Science");
    Department compSciDept=  scienceFac.openNewDepartment("Computer Science"); 
    Department physicsDept=  scienceFac.openNewDepartment("Physics"); 
    Console.WriteLine(Object.ReferenceEquals(
        scienceFac, physicsDept.Faculty)); //expected to return scienceFac object
    Console.WriteLine(University.numberOfFaculties());

//..... MORE CODE

我认为他使代码尽可能地令人困惑,而且它确实变得令人困惑。我才刚刚开始,我已经被困住了,但这就是我到目前为止所拥有的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace testschool
{
    class University
    {
        List<Faculty> all_faculty = new List<Faculty>();

        public Faculty createFaculty(string faculty_name)
        {
            Faculty new_faculty = new Faculty(faculty_name);
            all_faculty.Add(new_faculty);
            return new_faculty;
        }

        public int numberOfFaculties()
        {
            return all_faculty.Count;
        }
    }

    class Faculty
    {
        string faculty_name;
        List<Department> all_departments = new List<Department>();

        public Faculty(string faculty_name)
        {
            this.faculty_name = faculty_name;
        }

        public Department openNewDepartment(string department_name)
        {
            Department new_department = new Department(department_name, this);
            all_departments.Add(new_department);
            return new_department;
        }


    }

    class Department
    {
        string department_name;
        Faculty parent_faculty;
        public Department(string department_name, Faculty faculty)
        {
            this.department_name = department_name;
            parent_faculty = faculty;
        }

        public Faculty Faculty
        {
            get { return parent_faculty; }
        }
    }
}

到目前为止我的两个问题是:

首先: 这一行:Faculty scienceFac = University.createFaculty("Science"); 似乎是马上打电话给大学,没有对象引用。我将大学宣布为一门课程,因为它似乎也有像 .createFaculty("Science") 和 .numberOfFaculties() 这样的方法。那么这可能是一个错误吗?或者大学实际上是一个命名空间还是其他有自己方法的东西?

第二: 大学有院系,院系有系,最终到了有学生和有课程的地步。从代码中可以看出,我使用了列表,但我们还没有深入研究。只有数组(是的,我知道列表也是数组,但我说我只想坚持使用数组)。是否可以在不声明预定义大小的情况下使用数组? (我总是可以将大小设置为像 999 这样大的东西,但它并不实用)

【问题讨论】:

  • 请注意,我还没有以任何方式测试过代码,我被大学错误困住了,如果它错了,我不想从一开始就继续处理错误的代码
  • Faculty scienceFac = University.createFaculty("Science"); 只能在你有public static Faculty createFaculty(string faculty_name)时使用

标签: c# arrays oop object


【解决方案1】:

1- 正如@Peter Duniho 提到的,University.CreateFaculty() 是一个静态方法

public class University
{
    public static void CreateFaculty()
    {
        // a static method declared inside a class can be called without creating an instance of the object
    } 
}

2-要调整数组的大小,您可以执行以下操作

int[] data=new int[2];
data[0]=1;
data[2]=2;

data=ResizeData(data,3); // this function will return new array with array with length=5

public int[] ResizeData(int[] data,int number)
{
    int[] newArray=new int[number]();
    for(int i=0;i<data.Length;i++) // copy the data from dataArray to the newArray
       newArray[i]=data[i];
    return newArray;
}

希望对你有帮助

【讨论】:

  • 恕我直言,如果要调整数组大小,最好使用Array.Resize() method
  • @PeterDuniho 我假设他们没有使用任何类型的数据结构,列表、数组是数据结构类,我为他提供了一个使用普通数组的解决方案
  • @HadiHassan:Array.Resize() 方法适用于“普通数组”
  • 您可以将 List 转换回数组。
  • @HadiHassan:适合自己。即使从老师的示例中,我似乎也很清楚,该代码至少应使用最少的 C# 特定功能集。例如。 Object.ReferenceEquals()Console.WriteLine() 等。另请参见 C++ 中的 realloc
【解决方案2】:

问题的具体答案:

  1. University.createFaculty() 是一个静态方法。它使用类型名称而不是实例来调用。

  2. 要创建数组实例,您必须指定大小。但变量本身的声明没有任何大小信息。

我认为这解决了您具体询问的问题。当然,在教育环境中,如果有空,最好咨询老师。这有助于您获得更适合课程和老师希望您学习的内容的答案,并帮助老师了解每个学生在理解课程和作业方面的情况。

【讨论】:

  • University.createFaculty() 是一个静态方法吗?它没有在代码中的任何地方提及。
  • @DebopamChanda:学生编写的代码并未将其声明为静态。但是从老师给学生的代码中可以清楚地看出,该方法被称为University.createFaculty("Science"),它应该被声明为静态
  • 因为它使用了一个直接的类名,它不与我们看到的代码中任何地方的实例绑定。静力学使用 FQN 来访问函数。我教 C# 已经 7 年了,我想说这不是完全的 C#,而是一些丑陋的 Java 混合到 C# 代码中。
  • @Damon:我喜欢你对代码的看法。但在它的辩护中,当我编写 Java 代码时,我仍然使用所有 Java 人都讨厌的 .NET 命名约定。所以我尽量不要对在 C# 中使用 Java 命名约定的人过于苛刻。 :)
  • @Damon:我很想把它标记为 Java,直到我读到 Console.WriteLine 调用。
猜你喜欢
  • 2019-02-04
  • 2022-01-21
  • 1970-01-01
  • 2017-08-30
  • 2019-08-29
  • 2019-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多