考虑以下代码:
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");
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,输出以下内容:
我是人
但是,你可以看到它是一个实例Teacher
,而不是Person
.代码为什么这样做?
是否可以使用C#中的显式类型转换将基类对象分配给派生类引用?
我试过它,它会产生运行时错误.
假设我们有关于为Python编写C扩展模块Noddy
的教程中定义的类型.现在我们要创建一个派生类型,只覆盖它的__new__()
方法Noddy
.
目前我使用以下方法(为了便于阅读而删除了错误检查):
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);
Run Code Online (Sandbox Code Playgroud)
这有效,但我不确定它是不是正确的方法.我本来期望我也必须设置Py_TPFLAGS_HEAPTYPE
标志,因为我在堆上动态分配类型对象,但这样做会导致解释器中出现段错误.
我还想过明确地type()
使用PyObject_Call()
或类似地调用,但我放弃了这个想法.我需要将函数包装BrownNoddy_new()
在Python函数对象中并创建一个映射__new__
到此函数对象的字典,这看起来很愚蠢.
最好的方法是什么?我的方法是否正确?我错过了接口功能吗?
python-dev邮件列表(1) (2)上的相关主题有两个主题.从这些线程和一些实验中我推断出Py_TPFLAGS_HEAPTYPE
除非通过调用分配类型,否则我不应该设置type()
.这些线程中有不同的建议是手动分配类型还是调用更好type()
.如果我知道推荐的方法来包装应该插入tp_new
插槽的C函数,我会对后者感到满意.对于常规方法,这一步很简单 - 我可以PyDescr_NewMethod()
用来获得一个合适的包装器对象.我不知道如何为我的__new__()
方法创建这样的包装器对象- 也许我需要未记录的函数PyCFunction_New()
来创建这样的包装器对象.
我已经多次看到从类生成的Interface实例.为什么以这种方式使用接口?Interface实例仅在派生类的帮助下创建,我们只能通过此实例访问此接口成员.这有什么优势?我很困惑..
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();
}
}
Run Code Online (Sandbox Code Playgroud) 考虑:
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();
}
Run Code Online (Sandbox Code Playgroud)
我无法用GCC g ++ 3.4.4(cygwin)编译它.
在将这些转换为类模板之前,它们是非泛型的,派生类能够看到基类的静态成员.在C++规范的要求中是否会失去可见性,还是需要使用语法更改?
据我了解,每个实例Base<T>
都会有它自己的静态成员" ZEROFILL
"和" NO_ZEROFILL
",这Base<float>::ZEROFILL
和Base<double>::ZEROFILL
是不同的变量,但我真的不关心; 常量是为了代码的可读性.我想使用静态常量,因为在名称冲突而不是宏或全局方面更安全.
我需要扩展Networkx python包并Graph
为我的特殊需要添加一些方法
我想这样做的方法是简单地推导出一个新类说NewGraph
,并添加所需的方法.
然而,networkx中还有一些其他函数可以创建和返回Graph
对象(例如,生成随机图).我现在需要将这些Graph
对象转换为NewGraph
对象,以便我可以使用我的新方法.
这样做的最佳方式是什么?或者我应该以完全不同的方式解决问题?
如果我分配一个类的对象Derived
(具有基类Base
),并将指向该对象的指针存储在指向基类的变量中,我该如何访问Derived
该类的成员?
这是一个例子:
class Base
{
public:
int base_int;
};
class Derived : public Base
{
public:
int derived_int;
};
Base* basepointer = new Derived();
basepointer-> //Access derived_int here, is it possible? If so, then how?
Run Code Online (Sandbox Code Playgroud) 我有一个基类Person
和派生类Manager
和Employee
.现在,我想知道的是创建的对象是Manager
或者Employee
.
该人的具体如下:
from Project.CMFCore.utils import getToolByName
schema = getattr(Person, 'schema', Schema(())).copy() + Schema((TextField('FirstName', required = True, widget = StringWidget(label='First Name', i18n_domain='project')), TextField('Last Name', required = True, widget = StringWidget(label='Last Name', i18n_domain='i5', label_msgid='label_pub_city'))
class Manager(BaseContent):
def get_name(self):
catalog = getToolByName(self, "portal_catalog")
people = catalog(portal_type='Person')
person={}
for object in people:
fname = object.firstName
lname = object.lastName
person['name'] = fname+' '+ lname
# if the derived class is Employee then i would like …
Run Code Online (Sandbox Code Playgroud) 在Java派生类中,有没有办法"禁用"从基类继承的方法和/或字段?
例如,假设您有一个Shape
具有rotate()
方法的基类.您也可以从衍生出多种Shape
类:Square
,Circle
,UpwardArrow
等.
Shape
有一个rotate()
方法.但是我不想rotate()
让用户可以使用Circle
,因为它没有意义,或者是用户UpwardArrow
,因为我不希望UpwardArrow
能够旋转.
derived-class ×10
base-class ×3
c# ×3
c++ ×3
class ×3
inheritance ×3
python ×3
c++-faq ×1
casting ×1
explicit ×1
interface ×1
java ×1
plone ×1
pointers ×1
python-2.x ×1
python-c-api ×1
sealed ×1
templates ×1