Предположим, я пытаюсь смоделировать, что животные делают и как выглядят животные, и я хочу, чтобы код для каждого животного был отдельным, а код действий/выглядит отдельно. Как я могу моделировать это в C#?Разделение проблем и полиморфный дизайн
Это было бы идеально:
using System.Collections.Generic;
class PaintingAnimals {
class Animal {}
class Cat : Animal {}
class Dog : Animal {}
static void Paint(Cat cat) { System.Console.WriteLine("Cat"); }
static void Paint(Dog dog) { System.Console.WriteLine("Dog"); }
static void Paint(Animal animal) { System.Console.WriteLine("Animal"); }
public static void Main() {
var animals = new List<Animal> {new Cat(), new Dog()};
foreach (var animal in animals) {
Paint(animal); // Always prints "Animal" not "Cat" or "Dog"
}
}
}
Однако, если я правильно понимаю, этот код будет компилироваться только если Paint
определяется как Paint(Animal)
, а не как Paint(Cat)
или Paint(Dog)
, и поэтому я не могу разделить мой код каждое животное в разные функции, так что собаки и кошки будут окрашиваться по-разному.
Существует множество способов сделать это ... Как вариант проверить [шаблон посетителя] (https://en.wikipedia.org/wiki/Visitor_pattern) - возможно, реализованный с помощью Piant ((динамического) животного) 'и полный набор' Paint (Cat) '... переопределяет. –
не понимают, что вы имеете в виду «тот же код для обоих объектов», можете ли вы показать свою функцию Paint? –
@AlexeiLevenkov Шаблон посетителя! Полезный указатель, спасибо. – user12341234