Создайте класс пользователя социальной сети с минимальным набором данных (ФИО, дата рождения) - 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);
}
}
}