我正在编写一个模块,并希望为它可以引发的异常建立一个统一的异常层次结构(例如,从一个FooError抽象类继承所有foo模块的特定异常).这允许模块的用户捕获这些特定异常并在需要时明确地处理它们.但是由于其他一些例外,该模块提出的许多例外都被提出; 例如,由于文件上的OSError而导致某些任务失败.
我需要的是"包装"捕获的异常,使其具有不同的类型和消息,以便通过捕获异常的任何信息在传播层次结构中进一步提供信息.但我不想丢失现有的类型,消息和堆栈跟踪; 这对于试图调试问题的人来说都是有用的信息.顶级异常处理程序并不好,因为我试图在异常进入传播堆栈之前修饰异常,并且顶级处理程序为时已晚.
这部分是通过foo从现有类型(例如class FooPermissionError(OSError, FooError))派生模块的特定异常类型来解决的,但这并不会使现有异常实例包装在新类型中更容易,也不会修改消息.
Python的PEP 3134 "异常链接和嵌入式回溯"讨论了Python 3.0中为"链接"异常对象所接受的更改,以指示在处理现有异常期间引发了新的异常.
我正在尝试做的是相关:我需要它也在早期的Python版本中工作,我需要它不是为了链接,而只是为了多态.这样做的正确方法是什么?
两者之间有什么区别吗?
List<Map<String, String>>
Run Code Online (Sandbox Code Playgroud)
和
List<? extends Map<String, String>>
Run Code Online (Sandbox Code Playgroud)
?
如果没有差异,使用的好处是? extends什么?
据我所知:
C++提供了三种不同类型的多态性.
除了上述三种类型的多态性外,还存在其他种类的多态性:
我知道运行时多态性可以通过虚函数实现 ,静态多态可以通过模板函数实现
但对于另外两个
ad-hoc多态性:
如果可以使用的实际类型的范围是有限的,并且必须在使用之前单独指定组合,则这称为ad-hoc多态.
参数多态性:
如果所有代码都是在没有提及任何特定类型的情况下编写的,因此可以透明地使用任意数量的新类型,这称为参数多态.
我几乎无法理解他们:(
任何人都可以用一个例子解释他们两个吗?我希望这些问题的答案对他们大学的许多新的消息有所帮助.
请考虑以下事项:
class A {}
class B : A {}
class C
{
C()
{
var b = new B();
Foo(b);
Foo2(ref b); // <= compile-time error:
// "The 'ref' argument doesn't match the parameter type"
}
void Foo(A a) {}
void Foo2(ref A a) {}
}
Run Code Online (Sandbox Code Playgroud)
为什么会发生上述编译时错误?两者ref和out参数都会发生这种情况.
在C++中创建私有方法虚拟的优点是什么?
我在开源C++项目中注意到了这一点:
class HTMLDocument : public Document, public CachedResourceClient {
private:
virtual bool childAllowed(Node*);
virtual PassRefPtr<Element> createElement(const AtomicString& tagName, ExceptionCode&);
};
Run Code Online (Sandbox Code Playgroud) 从基类调用时,GetType()是否会返回派生类型最多的类型?
例:
public abstract class A
{
private Type GetInfo()
{
return System.Attribute.GetCustomAttributes(this.GetType());
}
}
public class B : A
{
//Fields here have some custom attributes added to them
}
Run Code Online (Sandbox Code Playgroud)
或者我应该创建一个抽象方法,派生类必须实现如下所示?
public abstract class A
{
protected abstract Type GetSubType();
private Type GetInfo()
{
return System.Attribute.GetCustomAttributes(GetSubType());
}
}
public class B : A
{
//Fields here have some custom attributes added to them
protected Type GetSubType()
{
return GetType();
}
}
Run Code Online (Sandbox Code Playgroud) // Cannot change source code
class Base
{
public virtual void Say()
{
Console.WriteLine("Called from Base.");
}
}
// Cannot change source code
class Derived : Base
{
public override void Say()
{
Console.WriteLine("Called from Derived.");
base.Say();
}
}
class SpecialDerived : Derived
{
public override void Say()
{
Console.WriteLine("Called from Special Derived.");
base.Say();
}
}
class Program
{
static void Main(string[] args)
{
SpecialDerived sd = new SpecialDerived();
sd.Say();
}
}
Run Code Online (Sandbox Code Playgroud)
结果是:
来自Special Derived.
来自Derived./*这不是预期的*/
从Base调用.
如何重写SpecialDerived类,以便不调用中产阶级"Derived"的方法?
更新: 我想继承Derived而不是Base的原因是Derived类包含许多其他实现.既然我不能在 …
任何人都可以提供一个简单的例子来解释Java中动态和静态多态的区别吗?
我对Haskell并不十分精通,所以这可能是一个非常简单的问题.
Rank2Types解决了什么语言限制?Haskell中的函数是否已经支持多态参数?
我们都知道C++中的虚函数是什么,但它们是如何在深层次实现的?
可以在运行时修改甚至直接访问vtable吗?
vtable是否适用于所有类,或仅适用于至少具有一个虚函数的类?
抽象类对于至少一个条目的函数指针只有一个NULL吗?
有一个虚拟函数会减慢整个班级的速度吗?或者只调用虚拟函数?如果虚拟功能实际被覆盖了,速度是否会受到影响,或者只要它是虚拟的,它就没有效果.
polymorphism ×10
c# ×3
c++ ×3
inheritance ×2
java ×2
c++-faq ×1
generics ×1
haskell ×1
oop ×1
overloading ×1
overriding ×1
python ×1
types ×1
vtable ×1