2012-07-13 29 views
5

मैं अगर मैं नीचे दो वर्ग पदानुक्रम के बीच संबंधों को मॉडल कर सकते हैं जिस तरह से सोच रहा था कि मैंने किया है,:यूएमएल वर्ग के साथ वर्ग रेखाचित्र रचना पदानुक्रम

car-engine composition relationship

कोड है कि के अर्थ का प्रतिनिधित्व करते हैं इस होगा कुछ की तरह:

public abstract class Car 
{ 
    protected Engine engine; 
} 
public class StreetCar extends Car 
{ 
    public StreetCar() 
    { 
      engine = new StreetEngine(); 
    } 
} 

... और इसी तरह वर्ग OffroadCar के लिए, यह engine = new OffroadEngine() की तरह कुछ करना होगा। मैंने त्वरित() विधि के बारे में कुछ भी शामिल नहीं किया है, यह प्रासंगिक नहीं है।

मैं सिर्फ यह जानना चाहता हूं कि संरचना सही ढंग से मॉडलिंग की गई है या यदि यह बहुत रचनात्मक तीर जोड़ने के लिए अनावश्यक या गलत है।

+0

यह होमवर्क की तरह गंध करता है। यदि ऐसा है, तो कृपया इसे इस तरह चिह्नित करें। – Jochen

+0

नहीं, यह होमवर्क नहीं है: पी – annouk

उत्तर

3

उत्तर प्रश्न से पहले, यह उन मामलों में से एक है, जहां रचना संबंधों से पदानुक्रम संबंधों को विभाजित करना एक अच्छा विचार है, जैसे कि वे विभिन्न प्रकार के आरेखों के साथ।

नोट: मैंने भ्रमित होने से बचने के लिए चित्र को "संरक्षित" और "कक्षा" उपसर्ग के रूप में जोड़ा है।

(1) संरचना आरेख

"CarClass" का एक वस्तु अपने 'EngineClass "की 1 एक वस्तु द्वारा रचित।

.............................................................................. 
..+-------------------------------------+........+-------------------------+.. 
..|   <<abstract>>    |........|  <<abstract>>  |.. 
..|    CarClass    |........|  EngineClass  |.. 
..+-------------------------------------+........+-------------------------+.. 
..| [#] Engine: EngineClass    |<*>-----+ [+] startEngine(): void |.. 
..+-------------------------------------+........+-------------------------+.. 
..| [+] acelerate(): void <<virtual>> |..................................... 
..+-------------------------------------+..................................... 
.............................................................................. 

(2,1) विरासत आरेख

"CarClass" का एक वस्तु कुछ परिदृश्य पर बच्चे कक्षाओं हो सकते हैं।

........................................... 
..+-------------------------------------+.. 
..|   <<abstract>>    |.. 
..|    CarClass    |.. 
..+-------------------------------------+.. 
..| [#] Engine: EngineClass    |.. 
..+-------------------------------------+.. 
..| [+] acelerate(): void <<override>> |.. 
..+-----------------+-------------------+.. 
.................../.\..................... 
................../...\.................... 
.................+--+--+.............................................................. 
....................|................................................................. 
....................+------------------------------------------+...................... 
....................|..........................................|...................... 
..+-----------------+-------------------+....+-----------------+-------------------+.. 
..|   <<concrete>>    |....|   <<concrete>>    |.. 
..|   StreetCarClass   |....|   OffRoadCarClass   |.. 
..+-------------------------------------+....+-------------------------------------+.. 
..| [+] acelerate(): void <<override>> |....| [+] acelerate(): void <<override>> |.. 
..+-------------------------------------+....+-------------------------------------+.. 
...................................................................................... 

(2,2) विरासत आरेख

"EngineClass" का एक वस्तु कुछ परिदृश्य पर बच्चे कक्षाओं हो सकते हैं।

........................................... 
..+-------------------------------------+.. 
..|   <<abstract>>    |.. 
..|    EngineClass    |.. 
..+-------------------------------------+.. 
..| [+] acelerate(): void <<override>> |.. 
..+-----------------+-------------------+.. 
.................../.\..................... 
................../...\.................... 
.................+--+--+.............................................................. 
....................+------------------------------------------+...................... 
....................|..........................................|...................... 
....................|..........................................|...................... 
..+-----------------+-------------------+....+-----------------+-------------------+.. 
..|   <<concrete>>    |....|   <<concrete>>    |.. 
..|   StreetEngineClass   |....|   OffRoadEngineClass   |.. 
..+-------------------------------------+....+-------------------------------------+.. 
..| [+] startEngine(): void <<override>>|....| [+] startEngine(): void<<override>> |.. 
..+-------------------------------------+....+-------------------------------------+.. 
...................................................................................... 

3 उत्तर

अब, यह एक मामले में, जहां एक वर्ग एक unleast एक सदस्य रचना है, और उसके प्रकार ओवरराइड किया जा सकता है, जब मुख्य वर्ग अपनी ओवरराइड। इसे कभी-कभी "पैरालेल पदानुक्रम सॉफ्टवेयर पैटर्न" या "दोहरी पदानुक्रम सॉफ्टवेयर पैटर्न" कहा जाता है।

आपने केवल प्रत्येक मुख्य वर्ग के 2 उप-वर्गों का उल्लेख किया है, लेकिन वास्तव में, और भी हो सकता है।

आमतौर पर मैं इस 2 तरीकों से चार्ट बना देता हूं। एक, मैं पहला आरेख बनाता हूं, एक टिप्पणी जोड़ता हूं, जो इंगित करता है कि यह मामला है।

3,1 मुख्य समानांतर पदानुक्रम आरेख

.............................................................................. 
..+-------------------------------------+........+-------------------------+.. 
..|   <<abstract>>    |........|  <<abstract>>  |.. 
..|    CarClass    |........|  EngineClass  |.. 
..+-------------------------------------+........+-------------------------+.. 
..| [#] Engine: EngineClass    |<*>-----+ [+] startEngine(): void |.. 
..+-------------------------------------+........+------------+------------+.. 
..| [+] acelerate(): void <<virtual>> |.....................|............... 
..+--------------+----------------------+.....................|............... 
.................|............................................|............... 
.................+--------------------------------------------+............... 
.................|............................................................ 
........+--------+-------+.................................................... 
........| Note:  |.................................................... 
........| Paralell  /.................................................... 
........| Hierarchy /| ................................................... 
........|   /|.................................................... 
........+-------------/--+.................................................... 
.............................................................................. 

दूसरे मामले, इसकी जब दोनों वर्गों बच्चे कक्षाएं दोनों सदस्यों को जोड़ने है कि है।

3।2 अतिरिक्त समानांतर पदानुक्रम आरेख

.............................................................................. 
..+---------------------------------------+........+-------------------------+.. 
..|    <<concrete>>    |........|  <<concrete>>  |.. 
..|   OffRoadCarClass   |........| OffRoadEngineClass |.. 
..+---------------------------------------+........+-------------------------+.. 
..| [+] createEngine(): void <<override>> |<*>-----+ [+] startEngine(): void |.. 
..+---------------------------------------+........| [+] nitroLevel(): void |.. 
..| [+] useNitro(): void     |........+------------+------------+.. 
..| [+] acelerate(): void <<override>> |.....................|............... 
..+--------------+------------------------+.....................|............... 
.................|..............................................|............... 
.................+----------------------------------------------+............... 
.................|............................................................ 
........+--------+-------+.................................................... 
........| Note:  |.................................................... 
........| Paralell  /.................................................... 
........| Hierarchy /| ................................................... 
........|   /|.................................................... 
........+-------------/--+.................................................... 
.............................................................................. 

मैं, अतिरिक्त चित्र जोड़ सकते हैं यदि necesarilly।

4 मुझे कोड

दिखाएँ क्रम में, यह "समांतर" पदानुक्रम का प्रबंधन करने, आम तौर पर, समग्र सदस्यों के निर्माण के अपने एक ओवरराइड विधि द्वारा प्रबंधित।

public abstract class EngineClass 
{ 
    public void startEngine() { ... } 
} // EngineClass 

public abstract class CarClass 
{ 
    protected EngineClass engine; 

    public CarClass() 
    { 
     // ... 
    } 

    public EngineClass createEngine() 
    { 
     EngineClass Result = new EngineClass(); 
     return Result; 
    } 

    public void start() 
    { 
     this.Engine = createEngine(); 
    } 
} // CarClass 

public class StreetCarClass extends CarClass 
{ 
    public StreetCarClass() 
    { 
     // ... 
    } 

    @override 
    public EngineClass createEngine() 
    { 
     EngineClass Result = new StreetCarEngineClass(); 
     return Result; 
    } 
} // StreetCarClass 

public class OffRoadCarClass extends CarClass 
{ 
    public OffRoadCarClass() 
    { 
     // ... 
    } 

    @override 
    public EngineClass createEngine() 
    { 
     EngineClass Result = new OffRoadCarEngineClass(); 
     return Result; 
    } 
} // OffRoadCarClass 

public class ExampleClass 
{ 
    public static main() 
    { 
     EngineClass OffRoadCar = new OffRoadCarClass(); 
     OffRoadCar.start(); 
    } 
} // OffRoadCarClass 

चीयर्स।

पीएस क्या मैं, आप, एक फिशबर्गर हज़ कर सकते हैं?

+1

आपने उन आरेखों को उत्पन्न करने के लिए क्या उपयोग किया? – Marvo

+3

@ मारवो: यह टूल, http://www.asciiflow.com/#Draw, लेकिन, मैंने हाथ से कुछ सामान – umlcat

+0

विषय को पूरी तरह से कवर करने के आपके प्रयासों के लिए बहुत बहुत धन्यवाद। लेकिन मुझे कुछ समझ में नहीं आता है। मैं एक से अधिक बड़े आरेख नहीं कर सकता। क्या मुझे समझना चाहिए कि उपरोक्त मेरा आरेख सही है और मुझे केवल "समांतर पदानुक्रम" टिप्पणी जोड़ने की आवश्यकता है? – annouk