小编Ale*_*ert的帖子

没有访客模式的动态调度

问题

我正在使用已经存在的库,以及我无法访问的源代码.该库代表AST.

我想复制此AST的部分内容,但重命名过程中对变量的引用.由于可以有一个包含Expression对象的AssignCommand-Object,我希望能够使用自己的函数复制每个对象,因此我可以递归地调用它们.但是,由于我无法访问库的代码,我无法添加诸如此类的方法CopyAndRename(string prefix).

因此,我的方法是创建一个Rename具有多个重载的单个函数.因此,我的家庭功能如下:

public static Command Rename(Command cmd, string prefix)
public static AssignCommand Rename(AssignCommand cmd, string prefix)
public static AdditionExpressionRename(AdditionExpression expr, string prefix)
....
Run Code Online (Sandbox Code Playgroud)

函数现在由a组成List<Command>,where AssignCommand是其子类Command.我假设我可以只传递CommandRename-function,运行时会找到最具体的一个.但是,情况并非如此,所有命令都会传递给Command Rename(Command cmd, string prefix).为什么会这样?有没有办法将调用委托给正确的函数而不使用丑陋的is操作?

最小的例子

我已将此问题解决为以下NUnit-Testcode

using NUnit.Framework;

public class TopClass{
    public int retVal;
}

public class SubClassA : TopClass{ }

[TestFixture]
public class ThrowawayTest {


    private TopClass Foo (TopClass x) {
        x.retVal = 1; …
Run Code Online (Sandbox Code Playgroud)

c# polymorphism mono overloading dynamic-dispatch

11
推荐指数
1
解决办法
2987
查看次数

应该在多大程度上采用#ifdef语句来获得硬件灵活性

据我了解,在嵌入式系统程序中包含不同硬件的不同选项的最佳方法之一是#ifdef语句.在风格上,这应该走多远?我想具体一点,如果有人使用#ifdef功能减速,你会摇头吗?

对我来说这感觉很傻,但是一个硬件选项需要不同类型的函数参数而不是另一个选项.有没有更简洁的方法来实现这种效果,还是更好地使用次优代码来实现某些硬件选项?

如果要阅读太多文本而您更喜欢代码:

#ifdef internaldac
    int dacWrite(int level) {
#else 
    int dacWrite(byte highbyte, byte lowbyte) {
#endif  
Run Code Online (Sandbox Code Playgroud)

我认为这是写这个的最有效方式,但我应该采用另一种方式(风格)吗?

c embedded coding-style arduino

0
推荐指数
1
解决办法
115
查看次数