Advertisement
Guest User

Untitled

a guest
Jul 15th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 8.51 KB | None | 0 0
  1. package ex07
  2.  
  3.  
  4. trait TUniversity {
  5.  
  6.     trait TStudent
  7.     type Student <: TStudent
  8.  
  9.     trait TCourseOfStudies[C <: Course]
  10.     type CourseOfStudies <: TCourseOfStudies[Course]
  11.  
  12.     trait TRoom
  13.     type Room <: TRoom
  14.  
  15.     trait TCourse
  16.     type Course <: TCourse
  17.  
  18.     def courses: Seq[Course]
  19.  
  20.     def allCourseOfStudies: Seq[CourseOfStudies]
  21.  
  22.     def students: Seq[Student]
  23.  
  24.     def rooms: Seq[Room]
  25.  
  26.     def makeRoomAvailable(room: Room)
  27.  
  28.     def enrollStudent(student: Student)
  29.  
  30.     def registerCourse(course: Course)
  31.  
  32.     def planCourseOfStudies(cos: CourseOfStudies)
  33. }
  34.  
  35.  
  36. trait TSimpleUniversity extends TUniversity {
  37.     trait TCourse extends super.TCourse {
  38.         def name: String
  39.         def lecturer: String
  40.         def creditPoints: Int
  41.         def room: Room
  42.     }
  43. //    type Course <: TCourse
  44.  
  45.     trait TRoom extends super.TRoom {
  46.         def number: String
  47.     }
  48. //    type Room <: TRoom
  49.  
  50.     trait TCourseOfStudies extends super.TCourseOfStudies[Course] {
  51.         def name: String
  52.         def courses[C <: Course]: Seq[C]
  53.         def degree: String
  54.         def totalCreditPoints: Int
  55.     }
  56. //    type CourseOfStudies <: TCourseOfStudies
  57.  
  58.     trait TStudent extends super.TStudent {
  59.         def name: String
  60.         def matriculationNumber: String
  61.         def courses: Seq[Course]
  62.         def courseOfStudies: CourseOfStudies
  63.     }
  64. //    type Student <: TStudent
  65. }
  66.  
  67. class SimpleUniversity extends TSimpleUniversity {
  68.     var Rooms = List.empty[Room]
  69.     var Courses = List.empty[Course]
  70.     var CoursesOfStudies = List.empty[CourseOfStudies]
  71.     var Students = List.empty[Student]
  72.  
  73.     type Student = TStudent
  74.     type Room = TRoom
  75.     type Course = TCourse
  76.     type CourseOfStudies = TCourseOfStudies
  77.  
  78.     def Student(str: String, str1: String, cos1: CourseOfStudies): Student = new Student {
  79.         override def name: String = str
  80.  
  81.         override def matriculationNumber: String = str1
  82.  
  83.         override def courseOfStudies: CourseOfStudies = cos1
  84.  
  85.         override def courses: Seq[Course] = Courses
  86.     }
  87.  
  88.     def CourseOfStudies(str: String, courses: List[Course], str1: String, i: Int): CourseOfStudies = new CourseOfStudies {
  89.         override def name: String = str
  90.  
  91.         override def courses[C <: Course]: Seq[C] = courses
  92.  
  93.         override def degree: String = str1
  94.  
  95.         override def totalCreditPoints: Int = i
  96.     }
  97.  
  98.     def Course(str: String, str1: String, i: Int, r1: Room): Course = new Course {
  99.         override def name: String = str
  100.  
  101.         override def lecturer: String = str1
  102.  
  103.         override def creditPoints: Int = i
  104.  
  105.         override def room: Room = r1
  106.     }
  107.  
  108.     def Room(str: String): Room = new Room {
  109.         override def number: String = str
  110.     }
  111.  
  112.     override def courses: Seq[Course] = {
  113.         Courses
  114.     }
  115.  
  116.     override def allCourseOfStudies: Seq[CourseOfStudies] = {
  117.         CoursesOfStudies
  118.     }
  119.  
  120.     override def students: Seq[Student] = {
  121.         Students
  122.     }
  123.  
  124.     override def rooms: Seq[Room] = {
  125.         Rooms
  126.     }
  127.  
  128.     override def makeRoomAvailable(room: Room): Unit = {
  129.         Rooms = Rooms :+ room
  130.     }
  131.  
  132.     override def enrollStudent(student: Student): Unit = {
  133.         Students = Students :+ student
  134.     }
  135.  
  136.     override def registerCourse(course: Course): Unit = {
  137.         Courses = Courses :+ course
  138.     }
  139.  
  140.     override def planCourseOfStudies(cos: CourseOfStudies): Unit = {
  141.         CoursesOfStudies = CoursesOfStudies :+ cos
  142.     }
  143.  
  144. }
  145.  
  146. trait TComplexUniversity extends TUniversity {
  147.     trait TRoom extends super.TRoom {
  148.         def building: String
  149.     }
  150.  
  151.     trait TStudent extends super.TStudent {
  152.         def loginId: String
  153.     }
  154.  
  155.     trait TCourse extends super.TCourse {
  156.         def prerequisites: Seq[Course]
  157.     }
  158.  
  159.     trait TCourseOfStudies extends super.TCourseOfStudies[Course] {
  160.         def coordinator: String
  161.     }
  162. }
  163.  
  164. trait TCompositeUniversity extends TSimpleUniversity with TComplexUniversity {
  165.     trait TRoom extends super[TSimpleUniversity].TRoom with super[TComplexUniversity].TRoom{}
  166.     trait TCourse extends super[TSimpleUniversity].TCourse with super[TComplexUniversity].TCourse{}
  167.     trait TStudent extends super[TSimpleUniversity].TStudent with super[TComplexUniversity].TStudent{}
  168.     trait TCourseOfStudies extends super[TSimpleUniversity].TCourseOfStudies with super[TComplexUniversity].TCourseOfStudies{}
  169. }
  170.  
  171. class ComplexUniversity extends TCompositeUniversity {
  172.     var Rooms = List.empty[Room]
  173.     var Courses = List.empty[Course]
  174.     var CoursesOfStudies = List.empty[CourseOfStudies]
  175.     var Students = List.empty[Student]
  176.  
  177.     type Student = TStudent
  178.     type Room = TRoom
  179.     type Course = TCourse
  180.     type CourseOfStudies = TCourseOfStudies
  181.  
  182.     def Student(str: String, loginId: String, str1: String, cos1: CourseOfStudies): Student = new Student{
  183.         def name: String = str
  184.  
  185.         def matriculationNumber: String = str1
  186.  
  187.         def courseOfStudies: CourseOfStudies = cos1
  188.  
  189.         def courses: Seq[Course] = Courses
  190.  
  191.         def loginId: String = loginId
  192.     }
  193.  
  194.     def CourseOfStudies(str: String, co: String, courses: List[Course], str1: String, i: Int): CourseOfStudies = new CourseOfStudies {
  195.         def name: String = str
  196.  
  197.         def courses[C <: Course]: Seq[C] = courses
  198.  
  199.         def degree: String = str1
  200.  
  201.         def totalCreditPoints: Int = i
  202.  
  203.         def coordinator: String = co
  204.     }
  205.  
  206.     def Course(str: String, str1: String, i: Int, r1: Room, pr: Seq[Course]): Course = new Course {
  207.         def name: String = str
  208.  
  209.         def lecturer: String = str1
  210.  
  211.         def creditPoints: Int = i
  212.  
  213.         def room: Room = r1
  214.  
  215.         def prerequisites: Seq[Course] = pr
  216.     }
  217.  
  218.     def Room(str: String, str1: String): Room = new Room {
  219.         def building: String = str1
  220.  
  221.         def number: String = str
  222.     }
  223.  
  224.     override def courses: Seq[Course] = {
  225.         Courses
  226.     }
  227.  
  228.     override def allCourseOfStudies: Seq[CourseOfStudies] = {
  229.         CoursesOfStudies
  230.     }
  231.  
  232.     override def students: Seq[Student] = {
  233.         Students
  234.     }
  235.  
  236.     override def rooms: Seq[Room] = {
  237.         Rooms
  238.     }
  239.  
  240.     override def makeRoomAvailable(room: Room): Unit = {
  241.         Rooms = Rooms :+ room
  242.     }
  243.  
  244.     override def enrollStudent(student: Student): Unit = {
  245.         Students = Students :+ student
  246.     }
  247.  
  248.     override def registerCourse(course: Course): Unit = {
  249.         Courses = Courses :+ course
  250.     }
  251.  
  252.     override def planCourseOfStudies(cos: CourseOfStudies): Unit = {
  253.         CoursesOfStudies = CoursesOfStudies :+ cos
  254.     }
  255. }
  256.  
  257.  
  258. object AdministrationTool {
  259.  
  260.     def printCourseOfStudies[U <: TUniversity](courseOfStudies: Seq[U#CourseOfStudies]): String = courseOfStudies.mkString("\n")
  261.  
  262.     def getListOfStudents[U <: TUniversity](students: Seq[U#Student]): String = students.mkString("\n")
  263.  
  264. }
  265.  
  266. object Main {
  267.  
  268.     def main(args: Array[String]): Unit = {
  269.         val u1 = simpleUniversity
  270.         val u2 = complexUniversity
  271.  
  272.         println(AdministrationTool.printCourseOfStudies(u1.allCourseOfStudies))
  273.         println(AdministrationTool.printCourseOfStudies(u2.allCourseOfStudies))
  274.         println(AdministrationTool.getListOfStudents(u1.students))
  275.         println(AdministrationTool.getListOfStudents(u2.students))
  276.     }
  277.  
  278.     def complexUniversity: TComplexUniversity = {
  279.         val cUni = new ComplexUniversity
  280.         val r1 = cUni.Room("Room1", "Building1")
  281.         val r2 = cUni.Room("Room2", "Building2")
  282.         val c1 = cUni.Course("Course1", "Lecture1", 3, r1, Nil)
  283.         val c2 = cUni.Course("Course2", "Lecture1", 6, r2, c1 :: Nil)
  284.         val cos1 = cUni.CourseOfStudies("cos1", "Coordinator1", List(c1, c2), "degree1", 9)
  285.         val s1 = cUni.Student("Student1", "ab12cdef", "1234", cos1)
  286.         cUni.registerCourse(c1)
  287.         cUni.registerCourse(c2)
  288.         cUni.makeRoomAvailable(r1)
  289.         cUni.planCourseOfStudies(cos1)
  290.         cUni.enrollStudent(s1)
  291.         cUni
  292.     }
  293.  
  294.     def simpleUniversity: TSimpleUniversity = {
  295.         val sUni = new SimpleUniversity
  296.         val r1 = sUni.Room("Room1")
  297.         val c1 = sUni.Course("Course1", "Lecturer1", 3, r1)
  298.         val c2 = sUni.Course("Course2", "Lecturer1", 6, r1)
  299.         val cos1 = sUni.CourseOfStudies("cos1", List(c1, c2), "degree1", 9)
  300.         val s1 = sUni.Student("Student1", "1234", cos1)
  301.         sUni.registerCourse(c1)
  302.         sUni.registerCourse(c2)
  303.         sUni.makeRoomAvailable(r1)
  304.         sUni.planCourseOfStudies(cos1)
  305.         sUni.enrollStudent(s1)
  306.         sUni
  307.     }
  308. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement