我的库有两个类,一个基类和一个派生类.在库的当前版本中,基类具有虚函数foo(),派生类不会覆盖它.在下一个版本中,我希望派生类可以覆盖它.这会破坏ABI吗?我知道引入一个新的虚函数通常会,但这似乎是一个特例.我的直觉是它应该改变vtbl中的偏移量,而不是实际改变表的大小.
显然,由于C++标准没有强制要求特定的ABI,这个问题在某种程度上是特定于平台的,但实际上,在大多数编译器中,断开和维护ABI是类似的.我对GCC的行为感兴趣,但是人们可以回答的编译器越多,这个问题就越有用;)
c++ virtual-functions backwards-compatibility abi subclassing
在objective-c中进行子类化时,如何在可变方法的情况下将调用转发给超类.我该怎么替换??? 下面发送我得到的所有对象?
- (void) appendObjects:(id) firstObject, ...
{
[super appendObjects: ???];
}
Run Code Online (Sandbox Code Playgroud) 我一直在尝试遵循有关创建容器视图控制器的教程.它在Objective-C中.我想将它转换为Swift.我在这里找到了一些相同的问题,但我没有从中得到太多.
这是代码.
import UIKit
class ContainerViewController: UIViewController { // Class "ContainerViewController" has no initializers - That I know why.
// 'required' initializer 'init(coder:)' must be provided by a subclass of UIViewController
var currentDetailViewController: UIViewController
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过做两个错误所说的,但仍然无效.
我有以下课程
class Foo():
data = "abc"
Run Code Online (Sandbox Code Playgroud)
我把它子类化了
class Bar(Foo):
data +="def"
Run Code Online (Sandbox Code Playgroud)
我正在尝试编辑子类中的父类属性.我希望我的父类有一些字符串,我的子类应该为该字符串添加一些额外的数据.如何在Python中完成?我设计错了吗?
我正在尝试使用装饰器来管理用户可能访问或不访问Web应用程序(在Google App Engine上运行)中的资源的方式.请注意,我不允许用户使用其Google帐户登录,因此无法在app.yaml中设置特定路径的特定访问权限.
我使用了以下资源:
- Bruce Eckel的装饰器指南
- SO:get-class-in-python-decorator2
- SO:python-decorators-and-inheritance
- SO:get-class-in-python-decorator
不过我还是有点困惑......
这是我的代码!在以下示例中,current_user是属于RequestHandler类的@property方法.它返回存储在数据存储区中的User(db.model)对象,其级别为IntProperty().
class FoobarController(RequestHandler):
# Access decorator
def requiredLevel(required_level):
def wrap(func):
def f(self, *args):
if self.current_user.level >= required_level:
func(self, *args)
else:
raise Exception('Insufficient level to access this resource')
return f
return wrap
@requiredLevel(100)
def get(self, someparameters):
#do stuff here...
@requiredLevel(200)
def post(self):
#do something else here...
Run Code Online (Sandbox Code Playgroud)
但是,我的应用程序对不同类型的资源使用不同的控制器.为了在所有子类中使用@requiredLevel装饰器,我需要将它移动到父类(RequestHandler):
class RequestHandler(webapp.RequestHandler):
#Access decorator
def requiredLevel(required_level):
#See code above
Run Code Online (Sandbox Code Playgroud)
我的想法是使用以下代码访问所有控制器子类中的装饰器:
class FoobarController(RequestHandler):
@RequestHandler.requiredLevel(100)
def get(self):
#do stuff here...
Run Code Online (Sandbox Code Playgroud)
我想我刚刚达到了关于装饰器和类继承的知识限制:).有什么想法吗 ?
我从Rails得到了很多回击,因为我将User子类化为许多不同的子类.在我的应用程序中,并非所有用户都是平等的 实际上有很多模型对象,并不是每个用户类型都可以访问它们.
我还需要一种方法来做多态行为.例如,许多方法的行为会有所不同,具体取决于类型.这不是多态性的意思吗?
但事实是,我总是从Rails回来.默认值 - 特别是表单提交给参数哈希的方式 - 似乎像非子类模型一样工作.链接和参数哈希只是默认设置真正咬你的两种方式.
在Rails中为不同类型的用户处理复杂逻辑的"正确"方法是什么?在Java中,子类化模型可以工作 - 您不必通过箍来使其按照您希望的方式工作.但是在Rails中,很难让子类使用REST约定,它会在你忘记包含:as => :user
时惩罚你,或者当你在链接中放入子类对象时惩罚你,例如edit_user_path(@user)
< - 坏主意!
还有一个区域也很难处理.假设我有一个Company
模型,它有很多Users
.这些用户可以是导演,教师,学员等 - 所有不同的子类.
当我们创建帐户时,我们可能想要使用accepts_nested_attributes_for :users
.但是,如果我们使用它,我们不能指定它创建的类.血淋淋的地狱!
似乎Rails中的所有内容都不希望您将模型子类化.如果你没有子类,一切都"正常".但如果你是子类,那你就是为了地狱.
解决办法是什么?
我正在制作一些文本查看器应用程序 目前我需要非常频繁和精确的线路处理能力,所以我想要继承NSTextStorage
类.但我找不到任何方法来设置新的文本存储NSTextView
.我能找到的唯一方法是
-[NSLayoutManager replaceTextStorage:]
Run Code Online (Sandbox Code Playgroud)
方法.但令人困惑的是,这是我正在寻找的.因为它似乎只是替换链接的NSLayoutManagers而不是NSTextView的文本存储.
我还考虑了子类化NSTextView和重写-textStorage
方法,但如果该类不是为子类设计的,那么它将产生未定义的结果.
有人试图在NSTextView上使用自定义NSTextStorage吗?我怎样才能做到这一点?或者这是否被设计禁止?
无论如何在Swift中进行子类化时重写内部框架方法?防爆.超
public class BarChartRenderer: ChartDataRendererBase {
internal func drawDataSet(context context: CGContext, dataSet: BarChartDataSet, index: Int) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
我想覆盖此方法以不同的方式绘制dataSet(iOS-Charts)
public class ESBarChartRenderer: BarChartRenderer {
overide func drawDataSet(context context: CGContext, dataSet: BarChartDataSet, index: Int) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我试图覆盖Xcode时给了我错误:
方法不会覆盖其超类中的任何方法
因为它是内部的.
还有一个内部变量,我需要访问和上面相同Xcode无法看到它.
我试图弄清楚如何在不指定父类的所有可选参数的情况下创建类的子类,但仍然可以从子类的构造函数访问它们。在继承具有无数属性的 Flutter 小部件时,这一点尤其重要。
例如,DoorWidget 是具有许多可选参数的父类。
ChildDoorWidget 继承了 DoorWidget 来增加额外的逻辑,但仍然想要所有可选的父参数,而不必在子类的 super() 方法中指定每个参数。
有没有办法做到这一点?
这是一个例子。
// Maine widget
class DoorWidget {
String color = 'red';
int width;
int height;
int p1;
int p2;
int p3;
Function onKicked = () => print('Kicked');
DoorWidget(this.color, {this.onKicked, this.width, this.height, this.p1, this.p2, this.p3});
}
class ChildDoorWidget extends DoorWidget {
@override
String color = 'green';
ChildDoorWidget(String color, {Function onKicked, int width, int height})
// Do I need to specify every parent optional parameter in the super class?
// …
Run Code Online (Sandbox Code Playgroud) 我试图子类io.TextIOWrapper
下面这篇文章,虽然我的目标是不同的.从这开始(NB:动机):
class MyTextIOFile(io.TextIOWrapper):
def read(self, *args):
cont = super().read(*args)
return cont.replace("\x00", "")
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用我的构造函数打开文件
In [81]: f = MyTextIOFile("file.csv")
Run Code Online (Sandbox Code Playgroud)
但这给了:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-90-343e18b2e32f> in <module>()
----> 1 f = MyTextIOFile("file.csv")
AttributeError: 'str' object has no attribute 'readable'
Run Code Online (Sandbox Code Playgroud)
事实上,似乎io.TextIOWrapper
构造函数希望传递一个文件对象.通过反复试验,我发现这个文件对象需要以二进制模式打开.但是我无法在任何地方找到文档,而且我不想构建在无证件行为之上(实际上,尝试继续使用它已经导致我在尝试传递对象时遇到问题csv.reader
).在Python 3中对文件对象进行子类化的正确和受支持的方法是什么?
我正在使用Python 3.5.0.
subclassing ×10
python ×3
swift ×2
abi ×1
c++ ×1
class ×1
cocoa ×1
dart ×1
decorator ×1
flutter ×1
internal ×1
io ×1
ios ×1
ios-charts ×1
model ×1
namespaces ×1
nstextview ×1
objective-c ×1
oop ×1
overriding ×1
python-3.x ×1
ruby ×1