Создайте класс пользователя социальной сети с минимальным набором данных (ФИО, дата рождения) - C#

Узнай цену своей работы

Формулировка задачи:

Задание. 1. Социальная сеть. Создайте класс пользователя социальной сети с минимальным набором данных (ФИО, дата рождения). Каждый пользователь может публиковать запись (простой вывод сообщения на консоль). Необходимо реализовать механизм подписки одних пользователей на публикации других. Самих пользователей можно создать непосредственно в исходном коде. При запуске программа ждет от вас ввода одной из команд: 1. Подписка (или отписка) пользователей. При этом необходимо указать пользователя подписчика и пользователя, на которого происходит подписка. 2. Публикация записи пользователем (с указанием пользователя и сообщения). Подписанные пользователи должны реагировать на публикации выставлением оценок (выбранных случайным образом). При этом оценка выводится в консоль с указанием оценивающего, оцениваемого сообщения и самой оценки. Вот такое вот задание. Делегаты и события надо использовать. Хотя я не понимаю что это такое. Если кто сможет написать такой код пож с объяснениями если можно. или по скайпу)

Решение задачи: «Создайте класс пользователя социальной сети с минимальным набором данных (ФИО, дата рождения)»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Threading;
 
namespace ConsoleApplication
{
    internal class Program
    {
        private static void Main()
        {
            var users = new List<User>
                        {
                            new User("Сергей", new DateTime(1986, 5, 8)),
                            new User("Игорь", new DateTime(1998, 3, 5)),
                            new User("Андрей", new DateTime(1990, 10, 10))
                        };
 
            users[1].Subscribe(users[0]);
            users[2].Subscribe(users[0]);
 
            users[0].Publish("Some message");
 
            users.ForEach(user => user.Dispose());
            Console.ReadKey(true);
        }
    }
 
    internal sealed class User : IDisposable
    {
        private static readonly Random Randomizer = new Random();
 
        // Коллекция для того, чтобы память под события не убегала.
        // Как альтернатива: менеджер на пользователем, который сам освобождает память;
        // или Weak Event.
        private readonly IList<Action<User, string>> subscriptions = new List<Action<User, string>>();
 
        public User(string name, DateTime birthday)
        {
            this.Name = name;
            this.Birthday = birthday;
        }
 
        public string Name { get; private set; }
 
        public DateTime Birthday { get; private set; }
 
        private event Action<User, string> onPublished;
 
        public event Action<User, string> OnPublished
        {
            add
            {
                this.subscriptions.Add(value);
                this.onPublished += value;
            }
 
            remove
            {
                this.subscriptions.Remove(value);
                this.onPublished -= value;
            }
        }
 
        public void Dispose()
        {
            foreach (Action<User, string> subscription in this.subscriptions)
            {
                this.onPublished -= subscription;
            }
            this.subscriptions.Clear();
        }
 
        public void Publish(string message)
        {
            Console.WriteLine("{0}: {1}", this.Name, message);
 
            // Вся эта шайтан-магия для потокобезопасности, обычно в виде метода расширения делается.
            object obj = this.onPublished;
            var action = Thread.VolatileRead(ref obj) as Action<User, string>;
            if (action != null)
            {
                action(this, message);
            }
        }
 
        public void Subscribe(User user)
        {
            user.OnPublished += this.Rate;
        }
 
        public void Unsubscribe(User user)
        {
            user.OnPublished -= this.Rate;
        }
 
        private void Rate(User user, string message)
        {
            int mark = Randomizer.Next(5) + 1;
            Console.WriteLine("{0} rated at {1}: '{2}' by {3}.", this.Name, mark, message, user.Name);
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.769 из 5
Похожие ответы