gpt4 book ai didi

c# - 将覆盖附加到 C# 类

转载 作者:行者123 更新时间:2023-11-30 19:12:49 26 4
gpt4 key购买 nike

我有一个带有函数的类:

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 函数,有时基于随机值不会调用基本函数。

编辑:真正解决这个问题的方法是以某种方式使用反射来更改虚拟方法表,我将在一个单独的问题上进行跟进。我把这个问题留在这里,以防有人找到更好的方法。

最佳答案

如评论中所述,装饰者模式正是您要寻找的。

http://en.wikipedia.org/wiki/Decorator_pattern

The decorator pattern can be used to make it possible to extend (decorate) the functionality of a certain object at runtime, independently of other instances of the same class, provided some groundwork is done at design time. This is achieved by designing a new decorator class that wraps the original class.

关于c# - 将覆盖附加到 C# 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5848745/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com