[英]how to access method in nested class from main - C#
這是我第一個問題的編輯:所以我再次檢查了作業。 所有代碼都在工作,因為我的教授希望它能夠工作,但只有我之前提出的問題是我的問題。 - 如何直接從列表中執行方法ShowGrade(當然是這樣):list [1] .ShowGrade(0)而不使用list [1] .s.ShowGrade(0)?? 我會把我所有的代碼放在這里。 Main中的兩個控制台線是他想要的(以及他想要的),我對作業的約束是:1。嵌套類課程中的學生課程(當然是一個學生)。 2.除了默認構造函數之外,根本沒有構造函數。 3. ShowGrade方法不在Course類中。 4.沒有操作員。 (點)在ShowGrade中,只有[] 5.方法Q1中只有一個查詢。
所以我的代碼是:
課程。 CS:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HW_1
{
public class Course
{
private delegate int Del(Course c);
internal string courseName { get; set; }
public class Student
{
internal string stuName { get; set; }
internal List<int> gradesList { get; set; }
//internal int ShowGrade(int index)
//{
// return gradesList[index];
//}
}
internal Student s = new Student();
public override string ToString()
{
string gr = null;
foreach (var g in s.gradesList)
gr += g + " ";
return string.Format("{0, -6} {1, -14} {2, -10}", courseName, s.stuName, gr);
}
}
}
Program.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HW_1
{
class Program
{
private delegate bool Del(Course c);
static void Main(string[] args)
{
List<Course> list = new List<Course>
{
new Course {courseName = "C#", s = new Course.Student {stuName = "Jojo", gradesList = new List<int>(){10, 20, 100}}},
new Course {courseName = "C", s = new Course.Student {stuName = "Bambi", gradesList = new List<int>(){99}}},
new Course {courseName = "Java", s = new Course.Student {stuName = "Bambi", gradesList = new List<int>(){}}}
};
Console.WriteLine("List of courses:");
Print(list);
Console.WriteLine("");
Console.WriteLine("");
Console.WriteLine("Press P / p for students who passed in average 60 and those who didn't.");
Console.WriteLine("");
Console.WriteLine("Press # for C# courses and others.");
Console.WriteLine("");
Console.WriteLine("Press any other key for courses with student who have at least one grade of 100 and all oter courses.");
char ch = (char)Console.Read();
Del d = ((ch == 'P' || ch == 'p') ? (Del)(c => c.s.gradesList.Count > 0 && c.s.gradesList.Average() >= 60) : ((ch == '#') ? (Del)(c => c.courseName == "C#") : (Del)(c => c.s.gradesList.Contains(100))));
var x = Q1 <IGrouping<bool, Course>>(list, d);
Print(x);
Console.WriteLine("");
//Console.WriteLine(list[1].ShowGrade(0));
//Console.WriteLine(list[2].ShowGrade(3));
}
static IEnumerable<T> Q1<T>(IEnumerable<Course> list, Del d)
{
var query =
from c in list
orderby d(c)
group c by d(c) into g
select g;
return (IEnumerable<T>)query;
}
static void Print(IEnumerable<IGrouping<bool, Course>> list)
{
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("Q1 Results:");
foreach (var g in list)
{
Console.WriteLine();
Console.WriteLine(g.Key);
Console.WriteLine("---------------");
foreach (var c in g)
Console.WriteLine(c);
}
}
static void Print<T>(IEnumerable<T> list)
{
foreach (var l in list)
Console.WriteLine(l);
}
}
}
兩個Console.writeline的輸出必須是:
list[1].ShowGrade(0)
99
list[2].ShowGrade(3)
你必須與學生的課程 ,公開為列表s
:
Console.Writeline(list[1].s.ShowGrade(0));
因此,您需要訪問list[x]
的s
字段。 但是,我建議您使用屬性而不是公共字段:
class Course
{
internal string c_name {get; set;}
public Student Student { get; private set; }
public Course()
{
this.Student = new Student();
}
}
我實際上建議你創建Student
作為非內部類 。 內部類應該僅在本地使用。
class Student
{
internal s_name {get; set;}
internal List<int> gradesList {get; set;}
}
如果您希望將Student
作為內部課程,則必須將其public
才能在Course
之外使用它。
list[n]
返回一個Course
,它有一個Student
屬性(一個課程可以有一個學生?),你想從哪里顯示成績。
您的Student
類需要此方法:
public int ShowGrade(int index)
{
return gradesList[index];
}
然后你可以打電話:
list[n1].s.ShowGrade(n2);
你的代碼肯定需要修改,因為有問題,即
new Course ("C#", s.s_name = "Bob", s.gradesList = new List<int>(){100, 99, 85})
不會編譯,似乎你對傳遞構造函數參數和對象初始化感到困惑。
我不能使用構造函數
您只能在某種程度上使用對象初始化,例如,給定c_name
是公共的,您可以這樣做:
var course = new Course()
{
c_name = "C#"
}
但是,你做不到:
var course = new Course()
{
s.gradeList = ...
}
你只需要手動設置它
var course = new Course()
{
c_name = "C#"
};
course.s.gradeList = new List<int>() { ... }
要回答你的問題,我會在這里使用一些封裝並在你的
Course
類中公開一個
ShowGrade
方法,它會給你你想要的代碼,即
Console.Writeline(list[1].ShowGrade(0));
在內部,
Course
只會將調用委托給學生實例,例如
public int ShowGrade(int grade) { return s.ShowGrade(grade); }
剛剛意識到你說你不能將ShowGrade
添加到Course
類中,在這種情況下你只需要從Course
訪問Student
屬性即
list[0].s.ShowGrade(0);
便士只是放在這一個,你需要有如下代碼:
public static class CourseExt
{
public static int ShowGrade(this Course course, int grade)
{
return course.s.ShowGrade(grade);
}
}
...
Console.WriteLine(list[0].ShowGrade(0));
但不能修改Course
類 - 唯一的選擇是使用擴展方法,例如
public static class CourseExt { public static int ShowGrade(this Course course, int grade) { return course.s.ShowGrade(grade); } } ... Console.WriteLine(list[0].ShowGrade(0));
以下是您要求的代碼:
class Course
{
internal string CourseName { get; set; }
public Student s { get; set; }
public class Student
{
internal string StudentName { get; set; }
internal IEnumerable<int> GradesList { get; set; }
public int ShowGrade(int index)
{
if (GradesList == null)
throw new NullReferenceException();
return GradesList.ElementAt<int>(index);
}
}
}
class Program
{
static void Main(string[] args)
{
List<Course> list = new List<Course>()
{
new Course () { CourseName = "C#",
s = new Course.Student() { StudentName = "Bob",
GradesList = new List<int>() { 100, 99, 85 }}},
new Course () { CourseName = "Java",
s = new Course.Student() { StudentName = "Bobi",
GradesList = new List<int>(){ 99, 90, 88 }}},
new Course (){ CourseName = "C",
s = new Course.Student() { StudentName = "Roni",
GradesList = new List<int>()}},
new Course (){ CourseName = "SQL",
s = new Course.Student() { StudentName = "Sean",
GradesList = new List<int>(){ 75, 62, 55 }}}
};
Console.WriteLine(list[0].s.ShowGrade(1));
Console.ReadKey();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.