标签: dynamic-binding

何时将C++中的函数标记为虚拟?

由于方法的静态绑定的C++性质,这会影响多态调用.

来自维基百科:

尽管此调度机制所涉及的开销很低,但对于该语言设计为目标的某些应用程序区域,它仍然可能很重要.出于这个原因,C++的设计者Bjarne Stroustrup选择了动态调度可选和非默认.只有使用virtual关键字声明的函数才会根据对象的运行时类型进行调度; 其他函数将根据对象的静态类型进行调度.

所以代码:

Polygon* p = new Triangle;
p->area();
Run Code Online (Sandbox Code Playgroud)

如果它area()是Child类non-virtual中Parent类中的函数overridden,则上面的代码将调用Parent's class method开发人员可能不期望的函数.(感谢我介绍的静态绑定)

所以,如果我想编写一个供其他人使用的类(例如库),我是否应该将所有函数都设置为虚拟,以便以前的代码按预期运行?

c++ polymorphism virtual dynamic-binding

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

如何在运行时加载的程序集中使用通用log4net引用?

我有一个单线程应用程序,它使用以下命令在运行时加载多个程序集:

objDLL = Assembly.LoadFrom(strDLLs[i]);
Run Code Online (Sandbox Code Playgroud)

我希望以这种方式加载的程序集使用与其余程序集相同的log4net.ILog引用.但似乎运行时加载的程序集完全具有不同的引用,并且需要自己的配置.有没有人知道是否可以在运行时使用.NET接口加载的程序集中使用单个log4net.ILog?

以下是Program类中的log4net.ILog创建和支持代码:

   // Configure log4net using the .config file
   [assembly: log4net.Config.XmlConfigurator(Watch = true)]

   public static class Program
   {
      private static log4net.ILog m_Log = null;

      [STAThread]
      public static void Main(string[] args)
      {
         try
         {
            m_Log = log4net.LogManager.GetLogger(
               MethodBase.GetCurrentMethod().DeclaringType);
         }

      }
   }
Run Code Online (Sandbox Code Playgroud)

c# reflection logging log4net dynamic-binding

10
推荐指数
1
解决办法
2750
查看次数

使用Spring的表单标记动态绑定列表

我有一个命令对象FaxForm,它包含FaxStatus一个faxStatusList属性内的对象列表.

public class FaxForm {
  private List<FaxStatus> faxStatusList;
  public void setFaxStatusList(List<FaxStatus> faxStatusList) {
    this.faxStatusList = faxStatusList;
  }
  public List<FaxStatus> getFaxStatusList() {
    return faxStatusList;
  }
}
Run Code Online (Sandbox Code Playgroud)

我最初有一个JSP页面,它通过执行以下操作来绑定对象:

<c:forEach items="${esaFaxForm.faxStatusList}" var="item" varStatus="loop">
  <tr class="tableAltBackground">
    <td>
      <form:checkbox path="faxStatusList[${loop.index}].selected"/>
    </td>
    <td>
      <form:select path="faxStatusList[${loop.index}].status" items="${esaFaxForm.statusOptions}" onchange="checkThisBox(this);"/>
    </td>
    <td>
      <a href="${statusContUrl}?id=${item.id}&status=${item.status}" onclick="openFaxWindow('${viewFaxUrl}?id=${item.id}', ${loop.index});">${item.name}</a>
      <form:hidden path="faxStatusList[${loop.index}].name"/>
    </td>
    <td>
      <a href="${statusContUrl}?id=${item.id}&status=${item.status}" onclick="openFaxWindow('${viewFaxUrl}?id=${item.id}', ${loop.index});">${item.id}</a>
      <form:hidden path="faxStatusList[${loop.index}].id"/>
    </td>
  </tr>
</c:forEach>
Run Code Online (Sandbox Code Playgroud)

但是,我试图弄清楚如何在没有forEach循环和索引的情况下进行绑定.Spring网站上的示例通过设置列表名称的路径来显示绑定.有没有办法绑定属性?我试过这个,但它失败了:

<form:checkbox path="faxStatusList.faxStatus.selected"/>
<form:select path="faxStatusList.faxStatus.status" items="${esaFaxForm.statusOptions}"/>
Run Code Online (Sandbox Code Playgroud)

faxStatusList有一个getter和setter方法,而FaxStatus变量每个都有getter/setter属性.我收到错误"bean类的无效属性'faxStatusList.faxStatus'......"

java spring dynamic-binding

10
推荐指数
1
解决办法
1万
查看次数

C#中的动态绑定

class A 
 {
   public virtual void WhoAreYou() { Console.WriteLine("I am an A"); }
 }
class B : A
{
  public override void WhoAreYou() { Console.WriteLine("I am a B"); }
}
class C : B
{
 public new virtual void WhoAreYou() { Console.WriteLine("I am a C"); }
}
class D : C 
{
  public override void WhoAreYou() { Console.WriteLine("I am a D"); }
}


C c = new D();
c.WhoAreYou();// "I am a D"
A a = new D();
a.WhoAreYou();// "I …
Run Code Online (Sandbox Code Playgroud)

c# dynamic-binding

10
推荐指数
1
解决办法
8343
查看次数

Elisp中的高阶函数

我创建了一个在Elisp中返回函数的函数:

(defun singleton-set (elem)
  (defun f (n) (= n elem))
  f)
Run Code Online (Sandbox Code Playgroud)

我尝试在IELM中运行它,它失败了:

ELISP> (singleton-set 5)
*** Eval error ***  Symbol's value as variable is void: f
ELISP> ((singleton-set 5) 5)
*** Eval error ***  Invalid function: (singleton-set 5)
Run Code Online (Sandbox Code Playgroud)

由于Lisp-1和Lisp-2有什么区别?我将代码更改为

(defun singleton-set (elem)
  (defun f (n) (= n elem))
  #'f)
Run Code Online (Sandbox Code Playgroud)

并调用(funcall (singleton-set 5) 5),但现在错误是

*** Eval error *** Symbol's value as variable is void: elem

我从elisp了解到:从内部函数捕获变量,这是由于Emacs Lisp的动态绑定.

如何在Emacs Lisp中使函数返回函数?这种机制与Python,Scala或Clojure等其他语言有什么不同?

相关问题:

emacs elisp dynamic-binding higher-order-functions

9
推荐指数
2
解决办法
1317
查看次数

静态成员函数继承

我是C++编程的新手,在做一些C++程序时我有一个疑问,那就是如何实现静态成员函数的动态绑定.正常成员函数的动态绑定可以通过将成员函数声明为虚拟来实现,但是我们不能将静态成员函数声明为虚函数,所以请帮助我.请看下面的例子:

#include <iostream>
#include <windows.h>
using namespace std;

class ClassA
{
     protected :
     int width, height;
     public:
     void set(int x, int y)
     {
       width = x, height = y;
     }
     static void print()
     {
       cout << "base class static function" << endl;
     }
     virtual int area()
     {
       return 0;
      }
};

class ClassB : public ClassA
{
     public:
   static void print()
   {
    cout << "derived class static function" << endl;
   }
   int area()
   {
    return (width * height);
   }
}; …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance static-methods dynamic-binding

8
推荐指数
1
解决办法
9282
查看次数

8
推荐指数
1
解决办法
1173
查看次数

DLR返回类型

我需要一些DLR帮助.我正在实现一个IDynamicMetaObjectProvider和DynamicMetaObject,但我遇到了一些问题,获得了预期的返回类型.我在metaobject中覆盖了BindInvokeMember,我可以看到所有的args类型但没有返回类型.有人知道如果可能的话我会怎么做?我知道返回类型是动态的,但是如果你调用的东西依赖于返回类型.除非我知道消费者期望的返回类型,否则我不知道要在DynamicMetaObject中执行哪个操作.

更新二

我不能在这里粘贴我的实际代码,因为它调用各种工作的东西.下面是一些示例动态对象代码.

public class TestDynamicMetaObject : DynamicMetaObject
{
    public TestDynamicMetaObject(Expression expression, object value)
        : base (expression, BindingRestrictions.Empty, value)
    {
    }

    public override DynamicMetaObject BindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject[] args)
    {
        Delegate method = new Func<int>(Test);
        return new DynamicMetaObject(
            Expression.Call(method.Method),
            BindingRestrictions.GetInstanceRestriction(Expression,Value),
            Value
        );
    }

    public static int Test()
    {
        return 10;
    }

}
public class TestDynamicObject : IDynamicMetaObjectProvider
{
    DynamicMetaObject IDynamicMetaObjectProvider.GetMetaObject(Expression parameter)
    {
        return new TestDynamicMetaObject(parameter, this);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的地方.

static void Main(string[] args)
{
    try
    {
        dynamic x = new TestDynamicObject(); …
Run Code Online (Sandbox Code Playgroud)

c# dynamic-language-runtime dynamic-binding

7
推荐指数
1
解决办法
2021
查看次数

接口范式性能(动态绑定与泛型编程)

虽然它们的核心动态绑定和模板是根本不同的东西,但它们可用于实现相同的功能.

代码示例(仅供参考)

A)动态绑定

namespace DB {
  // interface
  class CustomCode {
    public:
      virtual void operator()(char) const = 0;
  };
  class Lib {
    public:
      void feature(CustomCode const& c) {
        c('d');
      }
  };

  // user code
  class MyCode1 : public CustomCode {
    public:
      void operator()(char i) const {
        std::cout << "1: " << i << std::endl;
      }
  };
  class MyCode2 : public CustomCode {
    public:
      void operator()(char i) const {
        std::cout << "2: " << i << std::endl;
      }
  };

  void use() …
Run Code Online (Sandbox Code Playgroud)

c++ metaprogramming dynamic-binding

7
推荐指数
1
解决办法
1143
查看次数

浅层和深层绑定 - 此程序将打印什么?

我不知道怎么做...

function f1()
{
    var x = 10;
    function f2(fx)
    {
        var x;
        x = 6;
        fx();
    };

    function f3()
    {
        print x;
    };

    f2(f3);
};
Run Code Online (Sandbox Code Playgroud)

对于以下两种绑定方法中的每一种,程序将打印什么?A)浅结合B)深度结合

谢谢您的帮助!

binding programming-languages dynamic-binding static-binding

7
推荐指数
1
解决办法
2万
查看次数