У меня есть класс с функциями:
class MyClass
{
public List<Attachment> Attachments;
public void A()
{
// Do something
}
public void B()
{
// Do something
}
}
class AttachmentA : Attachment
{
public void A()
{
// Do something else
RealA();
}
}
class AttachmentB : Attachment
{
public void B()
{
// Do something else
// RealB();
// No need to call base function here
}
}
Мне нужно в моем коде, когда я присоединяю AttachmentA
к MyClass
, что все функции в MyClass
, которые также присутствуют в AttachmentA
быть переопределенным функциями в AttachmentA
, а также предоставить доступ к исходным функциям в MyClass
.
Например, я создаю MyClass
, а затем присоединяю к нему экземпляр AttachmentA
.вызов MyClass.A()
фактически вызовет AttachmentA.A()
, а AttachmentA.RealA()
вызовет базовую функцию, которая была переопределена.
Я знаю, что это можно как-то сделать с помощью чего-то вроде использования списков обработчиков событий для обработки переопределений, но есть простой способреализовать это?
Редактировать: У меня нет проблем с длинным кодом, который использует отражение до тех пор, пока он присутствует, и не должен даже упоминаться ни в одной из функций - возможно, только при присоединении вложения.
Редактировать: вы хотели пример:
class MyClass
{
public List<Attachment> Attachments;
public MyClass()
{
Attachments = new List<Attachment>();
}
public void Attach(Attachment attachment)
{
Attachments.Add(attachment);
// Do some magic here
}
public void A()
{
Console.WriteLine("MyClass.A");
}
public void B()
{
Console.WriteLine("MyClass.B");
}
}
class AttachmentA : Attachment
{
public void A()
{
Console.WriteLine("AttachmentA.A");
RealA();
}
}
class AttachmentB : Attachment
{
public void B()
{
Console.WriteLine("AttachmentB.B");
}
}
public class Program
{
public static void Main(string[] Args)
{
MyClass aaa = new MyClass();
aaa.A(); // should print MyClass.A
aaa.B(); // should print MyClass.B
aaa.Attach(new AttachmentA());
aaa.Attach(new AttachmentB());
aaa.A(); // should print AttachmentA.A <newline> MyClass.A
aaa.B(); // should print AttachmentB.B
}
}
Редактировать: я хочу достичь здесь, как юнит с атрибутами (= вложения).Когда устройство получает вложение RandomSpeed
, RandomSpeed
отменяет значение GetSpeed
и возвращает случайное значение.когда он получит вложение уклонения, он переопределит функцию единиц ReduceHP
, а иногда, основываясь на случайном значении, не вызовет базовую функцию.
Редактировать: Что действительно решит этот беспорядок, так это каким-то образом использует отражениечтобы изменить таблицы виртуальных методов, я собираюсь сделать продолжение по отдельному вопросу.Я держу этот вопрос здесь, если кто-то найдет лучший способ сделать это.