由于方法的静态绑定的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开发人员可能不期望的函数.(感谢我介绍的静态绑定)
所以,如果我想编写一个供其他人使用的类(例如库),我是否应该将所有函数都设置为虚拟,以便以前的代码按预期运行?
我有一个单线程应用程序,它使用以下命令在运行时加载多个程序集:
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) 我有一个命令对象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'......"
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) 我创建了一个在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等其他语言有什么不同?
相关问题:
我是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) 对于Clojure的文档with-local-vars,并with-bindings不足以对我来说,区分这两个.任何提示?
我需要一些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) 虽然它们的核心动态绑定和模板是根本不同的东西,但它们可用于实现相同的功能.
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) 我不知道怎么做...
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
dynamic-binding ×10
c# ×3
c++ ×3
binding ×1
clojure ×1
elisp ×1
emacs ×1
inheritance ×1
java ×1
log4net ×1
logging ×1
polymorphism ×1
reflection ×1
spring ×1
virtual ×1