Вивчай
Домашнє завдання #17 ·
балівintermediate

Класи User та Admin з наслідуванням

Створи ієрархію класів для системи управління користувачами.


Завдання

1. Клас User

class User {
  // constructor(name, email, age)
  // Валідація: name мін. 2 символи, email містить @, age 16-120
  // Кидає Error якщо валідація не пройшла

  // get info() — "Ім'я (email), вік: N"
  // greet() — "Привіт, я Ім'я!"
  // isAdult() — true якщо >= 18
  // static fromObject({ name, email, age }) — створити User з об'єкта
}

Приклад:

const user = new User("Олексій", "alex@test.com", 25);
console.log(user.info);     // "Олексій (alex@test.com), вік: 25"
console.log(user.greet());  // "Привіт, я Олексій!"
console.log(user.isAdult()); // true

const user2 = User.fromObject({ name: "Марія", email: "maria@test.com", age: 30 });

2. Клас Admin extends User

class Admin extends User {
  // constructor(name, email, age, permissions = [])
  // permissions — масив рядків: ["users", "content", "settings"]

  // hasPermission(perm) — чи є конкретний дозвіл
  // addPermission(perm) — додати (якщо ще немає)
  // removePermission(perm) — видалити
  // get info() — override: "Ім'я (email), вік: N [ADMIN]"
}

Приклад:

const admin = new Admin("Олексій", "alex@test.com", 25, ["users", "content"]);
console.log(admin.info);                // "Олексій (alex@test.com), вік: 25 [ADMIN]"
console.log(admin.hasPermission("users")); // true
admin.addPermission("settings");

3. Клас ModeratorUser extends User

class ModeratorUser extends User {
  // constructor(name, email, age, moderatedSections = [])
  // canModerate(section) — чи може модерувати секцію
  // get info() — override: "Ім'я (email), вік: N [MOD]"
}

4. Клас UserManager

class UserManager {
  // #users = [] (приватне поле)

  // addUser(user) — додає User/Admin/ModeratorUser
  // removeUser(email) — видаляє за email
  // findByEmail(email) — знайти користувача
  // getAdmins() — масив тільки адмінів (instanceof Admin)
  // getAllInfo() — масив info всіх користувачів
  // get count() — кількість
  // sortByAge() — відсортовані за віком (копія)
}

Бонус

  • Додай метод toJSON() та static fromJSON(json) для серіалізації
  • Реалізуй паттерн Observer: UserManager.on('userAdded', callback)
  • Збережи та відновити UserManager з localStorage

Критерії оцінки

КритерійБали
Клас User з валідацією та методами25
Клас Admin з наслідуванням та permissions25
Клас ModeratorUser15
Клас UserManager з усіма методами25
Використання private fields, static, getters10
Бонус: Серіалізація / Observer / localStorage+15