标签: derived-class

为什么在派生类中调用方法会调用基类方法?

考虑以下代码:

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# class derived-class

144
推荐指数
4
解决办法
7万
查看次数

是否可以使用显式类型转换将基类对象分配给派生类引用?

是否可以使用C#中的显式类型转换将基类对象分配给派生类引用?

我试过它,它会产生运行时错误.

c# casting explicit base-class derived-class

73
推荐指数
8
解决办法
11万
查看次数

如何在Python C-API中动态创建派生类型

假设我们有关于为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()来创建这样的包装器对象.

python derived-class python-2.x python-c-api

72
推荐指数
2
解决办法
4284
查看次数

为什么我们从Interface而不是Class创建对象实例?

我已经多次看到从类生成的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)

c# interface class derived-class

57
推荐指数
2
解决办法
5万
查看次数

53
推荐指数
3
解决办法
2万
查看次数

为什么派生的模板类不能访问基本模板类的标识符?

考虑:

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>::ZEROFILLBase<double>::ZEROFILL是不同的变量,但我真的不关心; 常量是为了代码的可读性.我想使用静态常量,因为在名称冲突而不是宏或全局方面更安全.

c++ templates c++-faq derived-class

43
推荐指数
2
解决办法
2万
查看次数

将基类转换为派生类python(或更多pythonic方式的扩展类)

我需要扩展Networkx python包并Graph为我的特殊需要添加一些方法

我想这样做的方法是简单地推导出一个新类说NewGraph,并添加所需的方法.

然而,networkx中还有一些其他函数可以创建和返回Graph对象(例如,生成随机图).我现在需要将这些Graph对象转换为NewGraph对象,以便我可以使用我的新方法.

这样做的最佳方式是什么?或者我应该以完全不同的方式解决问题?

python inheritance base-class derived-class

38
推荐指数
2
解决办法
3万
查看次数

C++从基类指针访问派生类成员

如果我分配一个类的对象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)

c++ inheritance pointers derived-class

36
推荐指数
4
解决办法
7万
查看次数

如何从基类获取派生类名

我有一个基类Person和派生类ManagerEmployee.现在,我想知道的是创建的对象是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)

python plone base-class derived-class

33
推荐指数
4
解决办法
2万
查看次数

在派生类上禁用继承的方法

在Java派生类中,有没有办法"禁用"从基类继承的方法和/或字段?

例如,假设您有一个Shape具有rotate()方法的基类.您也可以从衍生出多种Shape类:Square,Circle,UpwardArrow等.

Shape有一个rotate()方法.但是我不想rotate()让用户可以使用Circle,因为它没有意义,或者是用户UpwardArrow,因为我不希望UpwardArrow能够旋转.

java derived-class

28
推荐指数
4
解决办法
3万
查看次数