Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Created May 27, 2024 09:17
Show Gist options
  • Save sunmeat/41d156bd5bd74cf7acac281a267ec5d0 to your computer and use it in GitHub Desktop.
Save sunmeat/41d156bd5bd74cf7acac281a267ec5d0 to your computer and use it in GitHub Desktop.
solving #1 (interfaces)
abstract class Duck // абстрактная утка
{
public virtual void Swim()
{
Console.WriteLine("утка плавает!");
}
public abstract void Display(); // метод абстрактный, так как все утки будут отображаться по-разному
}
interface Flyable
{
void Fly();
}
interface Quackable
{
void Quack();
}
class MallardDuck : Duck, Flyable, Quackable
{
public override void Display()
{
Console.WriteLine("mallard.jpg");
}
public void Fly()
{
Console.WriteLine("дикая утка летит!");
}
public void Quack()
{
Console.WriteLine("дикая утка крякает!");
}
}
class RubberDuck : Duck, Quackable
{
public override void Display()
{
Console.WriteLine("rubberduck.jpg");
}
public void Quack()
{
Console.WriteLine("пиип-пииип!");
}
}
static class Program
{
static Duck GetSomeDuck()
{
var rand = new Random(100);
if (rand.Next(2) == 0)
return new RubberDuck();
return new MallardDuck();
}
static Quackable GetSomeQuackableDuck()
{
var rand = new Random(200);
if (rand.Next(2) == 0)
return new RubberDuck();
return new MallardDuck();
}
static void Main()
{
Console.WriteLine("Решение #1");
Duck duck = GetSomeDuck();
duck.Swim(); // этот есть у всех подтипов
duck.Display(); // этот тоже есть, просто сейчас не вызывается
Quackable q = GetSomeQuackableDuck();
q.Quack(); // доступен только такой метод для вызова через указатель типа Quackable
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment