我有一个A类,它有一个声明为私有的字段val.我想声明一个B类,它继承自A并具有对val的访问权限.有没有办法在C++上做到这一点?
我想这样做是因为我需要重载A的一些函数,而根本不需要更改A代码.
谢谢.
在 python 中创建子类时,如何确保我的子类实现方法不会无意中覆盖超类中的实现方法?我试图避免:
class A:
def a(self):
self._helper_func()
def _helper_func(self):
# do something specific to A
class B(A):
def b(self):
self._helper_func()
def _helper_func(self):
# do something; didn't realize this would mess up a()
Run Code Online (Sandbox Code Playgroud)
我认为唯一的选择是:(1)阅读超类的源代码,以确保我选择一个唯一的子类方法名称(当超类更新时,这可能会中断);或者(2)在子类中的所有实现方法上使用 __ (通常 __ 被描述为超类防止子类化的一种方式;但我认为这将有助于子类避免破坏超类)。
我在这里错过了什么吗?
更新 @sobolevn 基本上回答了我的问题。澄清一下:我所看到的关于名称修改的所有讨论都围绕超类试图隐藏/防止其方法被调用/覆盖(并且通常有评论说这不是 python 方式,用户应该尊重一个前导 _)。我担心子类化一个我没有编写的类(并且它本身没有使用名称修饰)以及为实现方法选择名称的非常不同的问题,这可能会无意中破坏超类(或其子类)中的代码父母)如果该名字已被使用。
根据我所读到的内容,在我看来,(a)编写我自己没有编写的类的子类的最佳实践是在所有私有方法前面加上 __ 前缀;但是(b)考虑到所有方法在Python中都是虚拟的,并且我经常希望我的子类公开一些新的公共/受保护的方法,除了充分了解所有类使用的所有非破坏方法名称之外,没有什么好的选择我继承了,并且这种意识将消除担心(a)的要求。
我在Employee和Manager类之间有继承.员工 - 超类,经理 - 子类.
class Employee(models.Model):
###
name = models.CharField(max_length=50, null=False)
address = models.CharField(max_length=50, null=False)
###
class Manager(Employee):
department = models.CharField(max_length=50)
###
here I don't want the 'name' and 'address' fields of Employee class.
(I want other fields of Employee and department field of this class to be stored in
Manager table in database)
###
Run Code Online (Sandbox Code Playgroud)
怎么能实现这一点.提前致谢.
如果我定义__getstate__()并__setstate__()在父类中,孩子是否能够继承这些方法?在这个SO答案中有一些相关的讨论,但仅限于具有前面的双下划线(dunder)的方法.
一些额外的信息: