от
Я пишу класс, который будет потреблять классы и создавать небольшие отчеты информации. Проблема заключается в том, что, хотя все они наследуют базовый класс, эти дочерние классы не должны реализовывать все методы и свойства одинаково. Просто соответствующие ... Я не могу приводить классы, потому что во время разработки я не знаю, какие из них будут использоваться ... У нас есть фреймворк, и в зависимости от работы разработчик берет его и реализует некоторый код, специфичный для работы. В их базовом классе есть несколько методов, которые они должны реализовать (Init, Report, Audit), но затем, в зависимости от типа задания, он будет иметь одно или два из нескольких свойств и один или два метода.  Таким образом (как мой упрощенный пример ниже) они могут реализовывать Cat, но им также нужен 2-й класс, который похож на Cat, но достаточно отличается, чтобы гарантировать новый класс, поэтому создайте Cat2. Я знаю, это звучит странно, но пока разработчики используют эту среду, они работают со своими экземплярами классов.
class Animal
{
////common stuff
  public 
}

class Cat : Animal
{
  public Name { get; set; }
  public Speak() 
  {
    Console.WriteLine("Meow");
  }
}
class Dog: Animal
{
  public Name { get; set; }
  public Speak() 
  {
    Console.WriteLine("Woof");
  }
}
class Person: Animal
{
  public Title{ get; set; }
  public Name { get; set; }
  public Speak() 
  {
    Console.WriteLine("Hello");
  }
}
class Spider: Animal
{
  public Name { get; set; }

}


List animals = new List {
  new Cat { Name = "Bob" },
  new Dog { Name = "Fido" },
  new Person { Name = "Harry", Title = "Mr" },
  new Spider { Name = "Boris" }
}

foreach (Animal item in animals)
{
  ///now is wishful pseudo code...
  if item has Speak then speak()
  if item has Title then write Title
  if item has Name then write Name
}
Я просто хочу просмотреть список, если у него есть определенное свойство, а затем прочитать его. Если у него есть определенный метод, тогда вызовите его.              

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

2 Ответы

0 голосов
от
  если у него есть определенное свойство, прочитайте его. Если у него есть определенный метод, тогда вызовите его. Похоже, что каждая из этих функций определяет
interface
, т.е.
interface IHazName { string Name {get;} }
interface IHazTitle { string Title {get;} }
interface ICanSpeak { void Speak(); }
...
foreach (Animal item in animals)
{
  if (item is ICanSpeak cs) cs.Speak();
  if (item is IHazTitle ht) Write(ht.Title);
  if (item is IHazName hn) Write(hn.Name);
}
...
class Cat : Animal, IHazName, ICanSpeak
{...}
class Dog : Animal, IHazName, ICanSpeak
{...}
class Person : Animal, IHazName, IHazTitle, ICanSpeak
{...}
class Spider : Animal, IHazName
{...}
Особенно полезная вещь в использовании интерфейсов заключается в том, что вы можете немного выдумать имена:
class Dog : Animal, IHazName, ICanSpeak
{
    //...
    public void Bark() { Say("woof"); } // method is called Bark on the public API
    void ICanSpeak.Speak() =
0 голосов
от
Вы можете добавить новый абстрактный метод, а затем реализовать его в дочерних классах.
class Animal
{
    abstract Work();
}

class Cat : Animal
{
    public Name;
    public Speak();
    override Work()
    {
        Speak();
        Write Name;
    }
}
class Person: Animal
{
    public Title;
    public Name;
    public Speak();
    override Work()
    {
        Speak();
        Write Title;
        Write Name;
    }
}

foreach (Animal item in animals)
{
    item.Work();
}
    
Добро пожаловать на сайт ByNets, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...