Имитировать механизм вызова метода наследованияC#

Место общения программистов C#
Anonymous
Имитировать механизм вызова метода наследования

Сообщение Anonymous »

У меня такая иерархия классов:

Код: Выделить всё

public class Base { }
public class Child1 : Base { }
public class Child2 : Base { }
Я хочу сгенерировать хэши для этих классов. Если бы я реализовал эти методы внутри классов, я мог бы легко использовать механизм наследования для получения правильных вызовов методов:

Код: Выделить всё

public class Base { public virtual string GetHash() { ... } }
public class Child1 : Base { public override string GetHash() { ... } }
public class Child2 : Base { public override string GetHash() { ... } }
Для данного экземпляра Base foo я мог бы просто вызвать foo.GetHash(), и это всегда будет правильный метод, поскольку наследование Механизм перенаправляет на конкретный метод GetHash для конкретного экземпляра foo (если foo имеет значение Child1, то он использует Child1.GetHash, если это Base, он использует Base.GetHash и т. д.).
Однако по причинам, не имеющим отношения к данному вопросу (связано с разделением задач), я не могу реализовать методы хеширования внутри классовая иерархия. Вместо этого у меня есть класс Hasher для этой задачи.
Вот простой способ реализовать его с помощью условной цепочки:

Код: Выделить всё

public class Hasher
{
public string GetHash(Base data)
{
if (data is Child1 c1)
return GetHashChild1(c1);
else if (data is Child2 c2)
return GetHashChild2(c2);
else
return GetHashBase(data);
}

private string GetHashChild1(Child1 c) { ... }
private string GetHashChild2(Child2 c) { ... }
private string GetHashBase(Base b) { ... }
}
Есть ли способ реализовать это по-другому, чтобы
  • в случае, если я добавлю новых дочерних классов в иерархию, мне нужно только реализовать соответствующие им методы хеширования (а не обновлять какие-либо операторы if-else-if/switch или заполнять словари и т. д.)?
  • другими словами: перенаправление на правильный метод происходит автоматически?
Может быть, общие методы (

Код: Выделить всё

GetHash(T ...)
) может как-то помочь?

Подробнее здесь: https://stackoverflow.com/questions/787 ... nheritance

Вернуться в «C#»