我已经多次看到一个从类生成的接口实例。为什么在这个方面使用接口呢?一个接口实例只在派生类的帮助下创build自己,我们只能通过这个实例访问这个接口成员。给我一个好处?我很困惑.. interface IPrint { void Print(); } class Sample : IPrint { public void Print() { Console.WriteLine("Print…"); } public void Sample() { Console.WriteLine("Sample…"); } } class Program { static void Main(string[] args) { IPrint print = new Sample(); print.Print(); } }
如何阻止类被其他类inheritance。
假设我们的Noddytypes是在编写Python的C扩展模块的教程中定义的。 现在我们要创build一个派生types,只覆盖Noddy的__new__()方法。 目前我使用下面的方法(为了可读性剥离错误检查): PyTypeObject *BrownNoddyType = (PyTypeObject *)PyType_Type.tp_alloc(&PyType_Type, 0); BrownNoddyType->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; BrownNoddyType->tp_name = "noddy.BrownNoddy"; BrownNoddyType->tp_doc = "BrownNoddy objects"; BrownNoddyType->tp_base = &NoddyType; BrownNoddyType->tp_new = BrownNoddy_new; PyType_Ready(BrownNoddyType); 这工作,但我不知道是否是正确的做法。 我会期望我也必须设置Py_TPFLAGS_HEAPTYPE标志,因为我dynamic地在堆上分配types对象,但这样做会导致解释器中的段错误。 我也想过使用PyObject_Call()或类似的方法显式调用type() ,但我放弃了这个想法。 我需要将函数BrownNoddy_new()包装在一个Python函数对象中,并创build一个将__new__映射到这个函数对象的字典,这似乎很愚蠢。 什么是最好的方式去做这件事? 我的方法是否正确? 有没有我错过的界面function? 更新 在python-dev邮件列表(1) (2)的相关主题上有两个线程。 从这些线程和几个实验我推断,我不应该设置Py_TPFLAGS_HEAPTYPE除非types是通过调用type()分配的。 在这些线程中有不同的build议是手动分配types还是调用type()更好。 如果我知道推荐的方法来包装应该在tp_new插槽中执行的C函数,我会对后者感到满意。 对于常规的方法,这一步将很容易 – 我可以使用PyDescr_NewMethod()来获得合适的包装对象。 我不知道如何为我的__new__()方法创build这样一个包装器对象 – 也许我需要未PyCFunction_New()的函数PyCFunction_New()来创build这样一个包装器对象。
考虑这个代码: class Program { static void Main(string[] args) { Person person = new Teacher(); person.ShowInfo(); Console.ReadLine(); } } public class Person { public void ShowInfo() { Console.WriteLine("I am Person"); } } public class Teacher : Person { public new void ShowInfo() { Console.WriteLine("I am Teacher"); } } 当我运行这个代码时,输出如下: 我是人 但是,你可以看到它是一个Teacher的实例,而不是Person的实例。 为什么代码会这样做?
考虑: template <typename T> class Base { public: static const bool ZEROFILL = true; static const bool NO_ZEROFILL = false; } template <typename T> class Derived : public Base<T> { public: Derived( bool initZero = NO_ZEROFILL ); // NO_ZEROFILL is not visible ~Derived(); } 我不能用GCC g ++ 3.4.4(cygwin)编译这个。 在将它们转换为类模板之前,它们是非generics的,派生类能够看到基类的静态成员。 在C ++规范的要求中是否会丢失可见性,或者是否需要使用语法更改? 我知道Base<T>每个实例都有它自己的静态成员“ NO_ZEROFILL ”和“ NO_ZEROFILL […]
是否有可能分配一个基类对象的派生类引用与明确的types转换在C#中? 我试过了,它创build了一个运行时错误。