2012-06-28 11 views
6

मैं सिर्फ कुछ चीजों के माध्यम से काम कर रहा हूं, जो एक परीक्षा के लिए अभ्यास कर रहा हूं, लेकिन एक चीज जिसे मैं अपना सिर नहीं प्राप्त कर सकता, एक वर्ग का उपयोग कर रहा है जो एक अलग वर्ग में है।जावा में किसी एक वर्ग में एक वर्ग के चर का उपयोग कैसे करें?

मेरे पास एक कोर्स क्लास और छात्र वर्ग है। कक्षा पाठ्यक्रम सभी अलग-अलग पाठ्यक्रमों को स्टोर करता है और जो मैं बस करने में सक्षम होना चाहता हूं वह कक्षा के छात्र में पाठ्यक्रम के नाम का उपयोग करना है।

public class Course extends Student 
{ 
    // instance variables - replace the example below with your own 
    private Award courseAward; 
    private String courseCode; 
    public String courseTitle; 
    private String courseLeader; 
    private int courseDuration; 
    private boolean courseSandwich; 

    /** 
    * Constructor for objects of class Course 
    */ 
    public Course(String code, String title, Award award, String leader, int duration, boolean sandwich) 
    { 
     courseCode = code; 
     courseTitle = title; 
     courseAward = award; 
     courseLeader = leader; 
     courseDuration = duration; 
     courseSandwich = sandwich; 

    } 

} 

यहाँ और छात्र है:

यहाँ मेरी कोर्स वर्ग है

public class Student 
{ 
    // instance variables - replace the example below with your own 
    private int studentNumber; 
    private String studentName; 
    private int studentPhone; 
    private String studentCourse; 

    /** 
    * Constructor for objects of class Student 
    */ 
    public Student(int number, String name, int phone) 
    { 
     studentNumber = number; 
     studentName = name; 
     studentPhone = phone; 
     studentCourse = courseTitle; 
    } 

} 

हूँ मैं कोर्स के भीतर 'फैली' का प्रयोग करने में सही हूँ? या यह अनावश्यक है?

छात्र के लिए मेरे कन्स्ट्रक्टर में, मैं कक्षा पाठ्यक्रम से 'कोर्स टिटल' को परिवर्तनीय 'studentCourse' असाइन करने की कोशिश कर रहा हूं। लेकिन मैं बस यह नहीं समझ सकता कि यह कैसे करें!

आपकी मदद के लिए अग्रिम धन्यवाद, मैं आपसे सुनने की आशा करता हूं!

धन्यवाद!

उत्तर

4

मुझे लगता है कि एक कोर्स छात्र नहीं है, इसलिए उन वर्गों के बीच विरासत शायद एक बुरा विचार है।

4

आपको उन्हें सार्वजनिक घोषित करना होगा।

एक बेहतर तरीका उन्हें निजी रखना है, और उस चर के लिए एक सार्वजनिक गेटर कोड। उदाहरण के लिए:

public Award getCourseAward(){ 
     return this.courseAward; 
} 
2

CourseStudent का विस्तार नहीं होना चाहिए। यदि आप courseTitleCourse फ़ील्ड तक पहुंचना चाहते हैं, तो आपको Course ऑब्जेक्ट को Student पर संदर्भित करना होगा और फिर कोर्स करें। कोर्स टाइटल।

2

आप किसी अन्य वर्ग से निजी गुणों तक नहीं पहुंच सकते हैं, यह ओओपी के मुख्य सिद्धांतों में से एक है: encapsulation। आपको उन गुणों तक पहुंच विधि प्रदान करनी है, आप कक्षा के बाहर प्रकाशित करना चाहते हैं। आम दृष्टिकोण सेटटर/गेटर्स है - केवल गेटर्स, यदि आप अपनी कक्षा को अपरिवर्तनीय बनाना चाहते हैं। यहां देखें: http://en.wikipedia.org/wiki/Mutator_method#Java_example

11

क्या मैं कोर्स के भीतर 'विस्तार' का उपयोग करने में सही हूं? या यह अनावश्यक है?

नहीं

दुर्भाग्य से, आप जानते हैं कि क्या आपके विरासत सही है या नहीं है, की जगह फैलीसाथ है-एक चाहते हैं। एक कोर्स एक छात्र है? जवाब न है। इसका मतलब है आपके Course का विस्तार नहीं होना चाहिए Student

एक छात्र एक Course शामिल कर सकते हैं, इसलिए Student वर्ग प्रकार Course के एक सदस्य चर हो सकता है। यदि आप मॉडल निर्दिष्ट करते हैं तो आप पाठ्यक्रमों की एक सूची परिभाषित कर सकते हैं (एक छात्र कई पाठ्यक्रमों में भाग ले सकता है)।

यहाँ एक नमूना कोड है: अब

public class Student{ 
    //.... 
    private Course course; 
    //... 
    public void attendCourse(Course course){ 
     this.course = course; 
    } 
    public Course getCourse(){ 
     return course; 
    } 
} 

, तो आपको निम्न हो सकते हैं:

Student bob = new Student(...); 
Course course = new Course(...); 
bob.attendCourse(course); 
2

यह भावना मनमाने ढंग से कक्षाओं का विस्तार करने के लिए नहीं है। विद्यार्थी एक कोर्स या इसके विपरीत नहीं है, इसलिए आप उन्हें इस तरह विस्तारित नहीं कर सकते हैं।

आपको क्या करने की जरूरत है:

पहले एक कोर्स बनाने के लिए:

 aStudent.setCourse(aCourse.title); 
:

 Student aStudent = new Student(..); 

छात्र को कोर्स में निर्दिष्ट करें:

 Course aCourse = new Course(..); 

एक छात्र बनाने

2

StudentCouse के साथ विस्तारित क्योंकि वे एक ही तरह के नहीं हैं। एक वर्ग को दूसरे के साथ विस्तार करना तब होता है जब अधिक सामान्य (एक अर्थ में) विशेषज्ञता प्राप्त होती है।
समाधान courseTitleStudent निर्माता का एक तर्क के रूप पारित करने के लिए किया जाएगा

2

3 अलग वस्तुओं यहाँ, एक पाठ्यक्रम, एक छात्र है, और एक नामांकन होनी चाहिए। एक नामांकन एक छात्र को पाठ्यक्रम में जोड़ता है, एक कोर्स में कई छात्र होते हैं, और एक छात्र कई पाठ्यक्रमों में नामांकन कर सकता है। उनमें से कोई भी एक दूसरे का विस्तार नहीं करना चाहिए।

+0

मुझे नहीं लगता कि आपको इस मामले के लिए कई मैपिंग टेबल (नामांकन ऑब्जेक्ट) में कई लोगों की अतिरिक्त परत की आवश्यकता है। (जब तक कि इसे किसी पारंपरिक डेटाबेस में जारी रखने की आवश्यकता न हो) –

+0

@ जॉन: हाँ, लेकिन चूंकि ओपी स्पष्ट रूप से ओओ का दुरुपयोग करने के कुछ प्रकार के भयानक उदाहरणों से अवगत कराया गया है, इसलिए मैं इसे मॉडलिंग के लिए एक और अधिक संपूर्ण विकल्प दिखाऊंगा। –

+0

जो समझ में आता है। –

2

शायद आपको छात्र के लिए पाठ्यक्रम का नाम जोड़ने की आवश्यकता नहीं है। मैं क्या करूँगा कोर्स में कुछ डेटास्ट्रक्चर में छात्रों को जोड़ना। यह क्लीनर है और पाठ्यक्रम और छात्र के बीच युग्मन को कम करता है। यह आपको छात्रों को एक से अधिक पाठ्यक्रमों में रहने की अनुमति भी देगा। उदाहरण के लिए:

public class Course extends Student{ 
    private Award courseAward; 
    private String courseCode; 
    public String courseTitle; 
    private Student courseLeader;//change to a student Object 
    private int courseDuration; 
    private boolean courseSandwich; 
    private Set<Student> students;//have course hold a collection of students 

/** 
* Constructor for objects of class Course 
*/ 
public Course(String code, String title, Award award, Student leader, int duration, boolean sandwich){ 
    courseCode = code; 
    courseTitle = title; 
    courseAward = award; 
    courseLeader = leader; 
    courseDuration = duration; 
    courseSandwich = sandwich; 
    this.students=new HashSet<Student>(); 
} 

public boolean addStudent(Student student){ 
    return students.add(student); 
} 

public Set<Student> getStudents(){ 
    return students; 
} 

}

2

पहले,

आप कोर्स वर्ग, जिसका मतलब है में छात्र वर्ग बढ़ा रहे हैं, छात्र वर्ग सभी coruse वर्ग गुण हो जाता है। तो, छात्र वर्ग में पाठ्यक्रम की संपत्ति नहीं है।

दूसरा, हाँ, यह unnesessary है - आप निम्न कार्य करने होंगे:

public class Course 
{ 
    private Award courseAward; 
    private String courseCode; 
    public String courseTitle; 
    private String courseLeader; 
    private int courseDuration; 
    private boolean courseSandwich; 

    public Course(String code, String title, Award award, String leader, int duration, boolean sandwich) 
    { 
     courseCode = code; 
     courseTitle = title; 
     courseAward = award; 
     courseLeader = leader; 
     courseDuration = duration; 
     courseSandwich = sandwich; 

    } 

} 

public class Student 
{ 
    private int studentNumber; 
    private String studentName; 
    private int studentPhone; 

    // This is where you keep the course object associated to student 
    public Course studentCourse; 

    public Student(int number, String name, int phone, Course course) 
    { 
     studentNumber = number; 
     studentName = name; 
     studentPhone = phone; 
     studentCourse = course; 
    } 
} 

उदाहरण उपयोग कुछ इस तरह होगा:

Course course = new Course("ASD", "TITLE", null, "ME", 50, true); 
Student student = new Student(1, "JOHN", "5551234", course); 

और फिर, बेशक अपनी आवश्यक जानकारी प्राप्त छात्र के माध्यम से, यानी:

student.studentCourse.courseTitle; 

अब से छात्र.स्ट्यूडेंट कोर्स कोर्स होगा अपनी सभी संपत्तियों के साथ वस्तु।

चीयर्स,

1

के रूप में उल्लेख किया है, दूर रहना इस बात के लिए "फैली" से। आम तौर पर, आपको तब तक इसका उपयोग नहीं करना चाहिए जब तक "एक-ए" संबंध समझ में नहीं आता है।

आप शायद कोर्स वर्ग पर तरीकों के लिए ही टिककर खेल प्रदान करना चाहिए:

public class Course { 
    ... 
    public String getTitle() { 
     return title; 
    } 
} 

और फिर अगर छात्र वर्ग की जरूरत है, यह किसी भी तरह निश्चित रूप से एक पकड़ (जो आप पर निर्भर है मिलेगा आपके डिजाइन), और फोन गेटर:

public class Student { 
    private Set<Course> courses = new HashSet<Course>(); 

    public void attendCourse(Course course) { 
     courses.add(course); 
    } 

    public void printCourses(PrintStream stream) { 
     for (Course course : courses) { 
      stream.println(course.getTitle()); 
     } 
    } 
} 
1

यहाँ नीचे अपनी समस्या का समाधान का पता लगाना और आप अपने मशीन पर कोड के नीचे की जांच करना चाहते हैं तो Test.java नाम की एक फ़ाइल बना सकते हैं और नीचे कोड पेस्ट:

पैकेज कॉम;

class Course 
{ 
    private Award courseAward; 
    private String courseCode; 
    public String courseTitle; 
    private String courseLeader; 
    private int courseDuration; 
    private boolean courseSandwich; 


    public Course(String code, String title, Award award, String leader, int duration, boolean sandwich) 
    { 
     courseAward = award; 
     courseCode = code; 
     courseTitle = title; 
     courseLeader = leader; 
     courseDuration = duration; 
     courseSandwich = sandwich; 

    } 

    public Award getCourseAward() { 
     return courseAward; 
    } 

    public void setCourseAward(Award courseAward) { 
     this.courseAward = courseAward; 
    } 

    public String getCourseCode() { 
     return courseCode; 
    } 

    public void setCourseCode(String courseCode) { 
     this.courseCode = courseCode; 
    } 

    public String getCourseTitle() { 
     return courseTitle; 
    } 

    public void setCourseTitle(String courseTitle) { 
     this.courseTitle = courseTitle; 
    } 

    public String getCourseLeader() { 
     return courseLeader; 
    } 

    public void setCourseLeader(String courseLeader) { 
     this.courseLeader = courseLeader; 
    } 

    public int getCourseDuration() { 
     return courseDuration; 
    } 

    public void setCourseDuration(int courseDuration) { 
     this.courseDuration = courseDuration; 
    } 

    public boolean isCourseSandwich() { 
     return courseSandwich; 
    } 

    public void setCourseSandwich(boolean courseSandwich) { 
     this.courseSandwich = courseSandwich; 
    } 
} 

class Student 
{ 
    private int studentNumber; 
    private String studentName; 
    private int studentPhone; 
    private Course studentCourse; 
    /** 
    * Constructor for objects of class Student 
    */ 
    public Student(int number, String name, int phone, Course course) 
    { 
     studentNumber = number; 
     studentName = name; 
     studentPhone = phone; 
     studentCourse = course; 
    } 

    public int getStudentNumber() { 
     return studentNumber; 
    } 
    public void setStudentNumber(int studentNumber) { 
     this.studentNumber = studentNumber; 
    } 
    public String getStudentName() { 
     return studentName; 
    } 
    public void setStudentName(String studentName) { 
     this.studentName = studentName; 
    } 
    public int getStudentPhone() { 
     return studentPhone; 
    } 
    public void setStudentPhone(int studentPhone) { 
     this.studentPhone = studentPhone; 
    } 
    public Course getStudentCourse() { 
     return studentCourse; 
    } 
    public void setStudentCourse(Course studentCourse) { 
     this.studentCourse = studentCourse; 
    } 
} 

class Award{ 
    private long awardId; 
    private String awardName; 

    Award(long awardId, String awardName){ 
     this.awardId = awardId; 
     this.awardName = awardName; 
    } 

    public long getAwardId() { 
     return awardId; 
    } 

    public void setAwardId(long awardId) { 
     this.awardId = awardId; 
    } 

    public String getAwardName() { 
     return awardName; 
    } 

    public void setAwardName(String awardName) { 
     this.awardName = awardName; 
    } 
} 

public class Test{ 
    public static void main(String ar[]){ 

     // use your all classes here 


    } 
}