امیرحسین که فردی است جوان و جویای نام! بهدنبال پیادهسازی سیستمی است که دنیا را تکان دهد. او فکری در سر دارد که احساس میکند اولین قدم از رسیدن به یک سیستم هوشمند قوی است.
او قصد دارد کلاسهایی را در زبان جاوا، فقط با داشتن اطلاعات کلی از آن کلاسها و بهصورت پویا ایجاد کند. امیرحسین که اولین گامهای این پروژه را نوشته، در تکمیل آن از شما کمک خواسته است.
# جزئیات پروژه
پروژهی اولیه را از [این لینک](/contest/assignments/45415/download_problem_initial_project/157739/) دانلود کنید. ساختار فایلهای پروژه اولیه بهصورت زیر است:
```
.
├── ClassDetail
├── ClassTypes
├── ClassUtil
├── Method
└── OopType
```
وظیفه اصلی شما در این سوال، تکمیل کلاس `ClassUtil` است. در این کلاس متدی با نام `classMaker` وجود دارد که پارامتر ورودی از نوع `ClassDetail` دریافت میکند و باید کلاسی با اطلاعاتی که از این پارامتر دریافت میکند، بسازد. در ادامه به بررسی کلاس `ClassDetail` میپردازیم:
### کلاس `ClassDetail`
این کلاس دارای ۵ پراپرتی زیر است:
1. پراپرتی `type`: این پراپرتی که از نوع `OopType` است مشخص کننده نوع کلاسی است که باید ساخته شود. این نوع میتواند `enum`، `interface` یا `class`باشد.
2. پراپرتی `name`: این پراپرتی که از نوع رشته است نام کلاس را مشخص میکند.
3. پراپرتی `properties`: این پراپرتی که از نوع `Map` است نوع و نام پراپرتیهای کلاس را مشخص میکند، در این مپ کلیدها نوع و مقادیر نام پراپرتیها است.
4. پراپرتی `methods`: این پراپرتی لیستی از کلاس `Method` است. کلاس `Method` نیز دارای سه پراپرتی `returnType`، `name` و `parameters` است که بهترتیب نام، نوع مقدار بازگشت و پارامترهای ورودی متد را مشخص میکند.
5. پراپرتی `oop`: این پراپرتی لیستی از رشتهها را مشخص میکند. این رشتهها نام کلاسهای جاواست که شما باید براساس نوع این کلاسها، آنها را `extends` یا `implements`کنید.
### کلاس `ClassUtil`
حال که با کلاس `ClassDetail` آشنا شدید باید کلاس `ClassUtil` را تکمیل کنید. در ادامه به بررسی دو مثال از عملکرد این کلاس خواهیم پرداخت.
فرض کنید قصد داریم تا یک `enum` با نام `Month` بسازیم که پراپرتی با نام `NAME` دارد. برای این کار کد زیر را مینویسیم و از متد کلاسی که تکمیل کردید استفاده میکنیم:
```java Main.java java
OopType type = OopType.ENUM;
String name = "Month";
Map<String, String> properties = Map.of("", "NAME");
String code = ClassUtil.classMaker(new ClassDetail(type, name, properties, List.of(), List.of()));
```
خروجی این کد باید کلاسی بهصورت زیر باشد:
```java Month.java java
public enum Month {
NAME;
}
```
در مثالی دیگر فرض کنید قصد داریم تا کلاسی بسازیم که دارای مقادیری بهصورت زیر باشد:
```java Main.java java
OopType type = OopType.CLASS;
String name = "Month";
Map<String, String> properties = Map.of("String", "name");
List<String> oop = List.of("Object");
String code = ClassUtil.classMaker(new ClassDetail(type, name, properties, List.of(), oop));
```
که در این حالت متغیر `code` باید بهصورت زیر باشد:
```java Month.java java
import java.lang.Object;
import java.lang.String;
public class Month extends Object {
String name;
}
```
# نکات
+ کلاس شما حتما باید بدون مشکل کامپایل شود.
+ تضمین میشود نام کلاسهایی که در پراپرتی `oop` قرار داده میشود، حتما وجود دارند و از پکیجهای استاندارد جاوا هستند.
+ کلاسی که میسازید **نباید** هیچ کلاس اضافی را `import` کرده باشد.
+ رعایت تمام موارد شیگرایی، بهعنوان مثال هر کلاس فقط میتواند یک کلاس را `extends` و ... ، باید در کلاس شما رعایت شده باشد.
+ در صورت وجود مشکل در قسمت `extends` یا `implements` ، کلاس شما باید کامل ساخته شود و فقط `extends` یا `implements` را نادیده بگیرد.
+ اگر کلاسی متد داشت، بدنه متدها باید خالی باشد و تضمین میشود نوع خروجی متدها `void` باشد.
# آنچه باید آپلود کنید
پس از پیادهسازی موارد خواستهشده، کلاس `ClassUtil` را زیپ کرده و ارسال کنید.