gpt4 book ai didi

c# - 方法重载 : funnel call to derived class argument overload

转载 作者:太空狗 更新时间:2023-10-29 22:24:56 25 4
gpt4 key购买 nike

好的,我正在尝试执行以下操作:

        protected bool ValidAdvert(Base item)
{
throw ThisIsAnAbstractClassException();
}

protected bool ValidAdvert(Derived1 item)
{
return ADerived1SpecificPredicate;
}

protected bool ValidAdvert(Derived2 item)
{
return ADerived2SpecificPredicate;
}

当基类传递给方法时,调用方法的派生类版本。基类是抽象的,所以这在理论上应该是可能的?

在有人说在类本身上重载方法之前,方法内部的逻辑依赖于大量不同的条件,其中没有一个是相关的,并且没有一个直接与 Base/Derived 类相关(例如作为登录状态等)

最佳答案

如果您觉得双重分派(dispatch)太麻烦,您可以通过反射调用该方法并动态解决适当的重载。

protected bool ValidAdvert(Base item)
{
if (item.GetType() == typeof(Base))
throw new ThisIsAnAbstractClassException();

Type type = typeof(CurrentClass);

MethodInfo method = type.GetMethod("ValidAdvert",
BindingFlags.Instance | BindingFlags.NonPublic,
null,
new Type[] { item.GetType() },
null);
return (bool)method.Invoke(this, new object[] { item });
}

protected bool ValidAdvert(Derived1 item)
{
return ADerived1SpecificPredicate;
}

protected bool ValidAdvert(Derived2 item)
{
return ADerived2SpecificPredicate;
}

这个模式叫做MultipleDispatch ,虽然通过反射调用方法比直接调用方法慢(如果每秒调用方法少于几百次,则不会产生开销),但它的好处是不需要修改类层次结构,如双重分派(dispatch)模式。

当 c# 4.0 带有 dynamic 关键字时,这将变得更加容易:

protected bool ValidAdvert(Base item)
{
if (item.GetType() == typeof(Base))
throw new ThisIsAnAbstractClassException();

dynamic dynamicThis = this;

return (bool)dynamicThis.ValidAdvert(item as dynamic);
}

关于c# - 方法重载 : funnel call to derived class argument overload,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2229262/

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