标签: subclassing

覆盖 UIImage(named:)

我正在重写 UIImage 类方法init(named:)。我的目标是能够检索图像的文件名。

代码如下所示:

class UIImageWithFileName: UIImage {

    let fileName: String

    override init(named:String){
        super.init(named)
    fileName = named
    }
}
Run Code Online (Sandbox Code Playgroud)

由于以下原因,此代码似乎是不可能的。

我创建了一个 UIImage 的子类,开始输入 init... 令我惊讶的是没有 init(named:) 方法可以覆盖。这是 init 方法的完整列表:

在此处输入图片说明

在此处输入图片说明

如何覆盖UIImage init(named:)

overriding initialization uiimage subclassing ios

6
推荐指数
1
解决办法
1955
查看次数

类不能使用 mypy 子类化“QObject”(类型为“Any”)

我有一个继承 QObject 的类。一切正常,但是当我在其上运行 mypy 时,出现错误:

"error: Class cannot subclass 'QObject' (has type 'Any')" 
Run Code Online (Sandbox Code Playgroud)

此刻我完全被困住了。我一直在阅读 mypy 文档,但找不到错误所在。

这里的代码:

from PyQt5.QtCore import QObject

class ServiceLocator(QObject):

    def __init__(self) -> None:
        super().__init__()
        ...
Run Code Online (Sandbox Code Playgroud)

干杯。

python pyqt type-hinting subclassing mypy

6
推荐指数
2
解决办法
4325
查看次数

子类 DataFrame 的 Pandas groupby、resample 等

注意:下面的线程提示了一个 pull request,它最终被合并到v1.10 中。此问题现已解决。

我正在使用子类化的 DataFrame,以便我可以更方便地访问某些特定于我的用例的转换方法和元数据。大多数 DataFrame 操作按预期工作,因为它们返回子类的实例,而不是pandas.DataFrame. 然而,聚合操作喜欢DataFrame.groupby并且DataFrame.resample似乎把这搞砸了。

这是一个错误,还是在定义我的子类时遗漏了什么?

下面是一个最小的例子,在 Pandas 0.25.1 上测试过:

class MyDataFrame(pd.DataFrame):
    @property
    def _constructor(self):
        return MyDataFrame

dates = pd.date_range('2019', freq='D', periods=365)
my_df = MyDataFrame(range(len(dates)), index=dates)

assert isinstance(my_df, MyDataFrame)
# Success!

assert isinstance(my_df.diff(), MyDataFrame)
# Success!

assert isinstance(my_df.sample(10), MyDataFrame)
# Success!

assert isinstance(my_df[:10], MyDataFrame)
# Success!

assert isinstance(my_df.resample("D").sum(), MyDataFrame)
# AssertionError

assert isinstance(my_df.groupby(df.index.month).sum(), MyDataFrame)
# AssertionError
Run Code Online (Sandbox Code Playgroud)

python subclassing dataframe pandas

6
推荐指数
1
解决办法
317
查看次数

实用程序类与子类.net控件

我想重用我编写的一些代码来为datagridview添加一些功能.我希望公开默认的datagridview属性和事件,因此我不想创建新的自定义组件.所以我尝试编写一个子类,工作正常.但我也想到我可以编写一个独立的实用程序类,它在构造函数中获取datagridview并以相同的方式设置它.例如

public class
MyGrid
{
    private DataGridView m_dg;

    public MyGrid(DataGridView dg)
    {
        m_dg = dg;
        m_dg.RowHeadersVisible = false;
        m_dg.SortCompare += new DataGridViewSortCompareEventHandler(m_dg_SortCompare);
    }

    void m_dg_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
    {
        // do custom sorting here
    }
}
Run Code Online (Sandbox Code Playgroud)

所以在我的应用程序启动的某个地方,我会打电话

MyGrid g1 = new MyGrid(dataGridView1);
MyGrid g2 = new MyGrid(dataGridView2);
Run Code Online (Sandbox Code Playgroud)

等等.这种方法的任何缺点?看起来大部分代码都是一样的,不同之处在于如何实例化扩展网格(将子类控件拖放到表单中,拖动普通数据网格并调用上面的代码)

c# controls datagridview subclassing

5
推荐指数
1
解决办法
745
查看次数

有没有办法改变scrollRectToVisible的速度?

有没有办法在滚动UIScrollView时更改scrollRectToVisible动画的速度?

iphone animation objective-c uiscrollview subclassing

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

Ruby - 如何处理子类意外覆盖超类私有字段的问题?

假设你写了一个类Sup,我决定将它扩展为Sub< Sup.我不仅需要了解您发布的界面,还需要了解您的私人领域.见证这个失败:

class Sup

  def initialize
    @privateField = "from sup"
  end

  def getX
    return @privateField
  end
end

class Sub < Sup

  def initialize
    super()
    @privateField = "i really hope Sup does not use this field"
  end
end

obj = Sub.new
print obj.getX #  prints "i really hope Sup does not use this field"
Run Code Online (Sandbox Code Playgroud)

问题是,解决这个问题的正确方法是什么?似乎子类应该能够使用它想要的任何字段而不会弄乱超类.

编辑:Java中等效示例返回"from Sup",这也是应该产生的答案.

ruby oop subclass subclassing

5
推荐指数
1
解决办法
580
查看次数

子类化NSPredicate以添加运算符

Cocoa定义了谓词类(NSPredicate,NSExpression等),它"提供了在Cocoa中指定查询的一般方法" 谓词编程.这组课程描述了我需要的东西,但有一点简短:我想要额外的操作员.

NSComparisonPredicate已经处理了14个运算符(NSPredicateOperatorType),但我想添加,例如,时间运算符...或运算符来表示以下内容:

  • " 变量 至少有 n 个条目 " (二元运算符)
  • " 变量 具有 为至多 Ñ 连续日 " (三元运算符)

显然,我需要自己实现这些,并且执行此类查询的数据模型必须支持这些运算符.但是,有没有办法实现它并从现有的NSPredicate类中受益?由于运营商被定义为enum,我怀疑我可以在这方面延伸.或者我完全错过了这艘船?!

cocoa objective-c subclassing nspredicate

5
推荐指数
1
解决办法
896
查看次数

如何在不更改父项的情况下从子项中删除继承的对象

(注意:更改名称以保护有罪)

因此,假设我正在对VisualCruft 8进行修改(早已被供应商停止),并将这些修改应用于"公司A"的ERP软件(很久以后被"公司S"收购,然后他们停止了一些软件多年后,由于VisualCruft自行停产).

我经常需要做的一个修改是向表单添加,更改或删除字段.这是大多数ERP软件的基础,每年都会出现几次.我们的ERP软件包的布局,我们将其称为"HotPockets版本3",将表单划分为"类库",而这些类库只是用于保存表单对象的桶.当然,"形式"中嵌入了"控制"对象.

每次安装HotPockets 3时,您都会获得表单的系统版本,以及单独的类库中的子版本,它只是父类的重新类,因此表单,控件,业务逻辑等都存在在孩子身上 原始("公司A")供应商声明的意图是允许您对覆盖父级的子进行更改,同时允许所述供应商向父级发布补丁/更改/任何内容.理论上这看起来很棒.在实践中,存在问题.具体来说,当在父级中定义控件本身并且不更改父级时,如何删除或更改表单上的控件?目的是用具有不同行为的不同控件替换控件,尽管在某些情况下我还必须完全删除控件.所以,您也可以将其称为"如何在不改变父项的情况下从子项中删除继承的对象"?

有一些已知的解决方案,但我问这个问题,因为我想看看是否有比我提供的更好的答案. 为避免重复答案,我将列出当前已知的解决方案,但请记住,我正在寻找此处未列出的内容.

解决方案不当1

虽然我不应该修改父代,但我确实可以访问父代码.我可以简单地记下所讨论的控件的所有属性和方法,从父级删除控件,然后返回到子级并重新实现所有属性和方法.对于大幅度的更改,例如用某个网格替换单个文本框,这是可行的.然而,它完全"违反规则",并且为此产品提供支持的VAR有点皱眉(注意:VAR不是"公司A"或"公司S").请记住,不仅原始供应商已经解散,而且产品和语言也已不复存在.

解决方案不当2

"隐藏"父窗体上的组件,然后(如果合并新组件)将新更改添加到子窗体.这在实践中听起来很棒,直到你意识到所有旧代码都挂钩到了父代,现在......它是隐形的.这意味着重命名父组件的版本,并通过解决方案1中列出的所有"端口属性和方法".在这种情况下......为什么我要再次这样做?

解决方案不当3

对于那些我希望控件消失的情况,我可以通过设置visibility属性来隐藏子控件.这不会删除或更改任何现有代码,一切都会继续运行.然而,绑定到它的控件和数据库字段现在"捆绑"并且不可用,除非我查看解决方案1或解决方案2之类的东西,因为任何试图弄乱控件的操作都可能在调用期间导致副作用,和/或以编程方式替换控件下面的数据使用户无法观察发生的情况.而这只能解决视觉上消失的控制问题- 它并没有解决它的问题.

极不正确的解决方案4

该死的鱼雷,从父母那里删除控制,全力以赴!

显然,这是一个非常糟糕的决定......

你会注意到所有的解决方案都涉及触摸父母,这是我不应该做的事情 - 这使我们完整地回答了这个问题.

其他解决方案不可用

  • 用其他东西替换HotPockets版本3.这不是我决策的范畴.

  • 使用(在此处插入喜欢的宠物语言)重写我需要的HotPockets版本3.虽然我不介意这样做 - 我确实拥有像大多数人一样的自己的宠物语言 - 但这不是一种可能性,因为VisualCruft几乎与它本身一起工作.相信我,这比在VisualWidget 3.14159HeyDoYouSmellCoffee甚至ILikeSnakes中编写扩展所需的努力大10倍,找出某种跨语言调用,集成它,测试它,让IT管理人员注销它,让VAR也签署它,而不是只是坚持使用VisualCruft中的本机工具.

  • 让VAR做到这一点.不要采取错误的方式,VAR做得很好,提供持续的支持,并提供了许多有用的修改.但是有成本因素可以发挥作用,如果变化是由我而不是VAR进行的,那么它更具成本效益.这根本与他们无关.

forms oop erp subclassing

5
推荐指数
1
解决办法
159
查看次数

Xcode 6.3/iOS 8.3中的新功能:使用self alloc方便构造函数会导致构建错误

此代码在Xcode 6.2和6.3之间没有变化,但[self alloc]现在包含的行会导致错误:

Multiple methods named 'initWithType:' found with mismatched result, parameter type or attributes

@implementation AGNetworkDataRequest

+ (instancetype)networkDataRequestWithType:(AGNetworkDataRequestType)type
{
    AGNetworkDataRequest *r = [[self alloc] initWithType:type];//error here
    return r;
}

- (id)initWithType:(AGNetworkDataRequestType)type
{
    //typical init code
}

//...
Run Code Online (Sandbox Code Playgroud)

如果我Cmd +点击了这个initWithType:电话,我会看到冲突CAEmitterBehavior,我们项目中没有引用的对象,但我猜测必须是iOS 8.3中的新功能.

如果我更改了[self alloc]to [AGNetworkRequest alloc],继承此方法的子类将只返回父对象,这与我们设计此类的方式相反.

如何在不更改方法名称的情况下消除冲突(这需要更改整个应用程序中的所有方法调用)?

objective-c subclassing ios xcode6.3

5
推荐指数
1
解决办法
1243
查看次数

在创建元组的子类时调用__new__

在Python中,当子类化元组时,__new__使用self作为参数调用该函数.例如,这是PySpark Row类的一个释义版本:

class Row(tuple):
    def __new__(self, args):
        return tuple.__new__(self, args)
Run Code Online (Sandbox Code Playgroud)

help(tuple)没有显示出self参数__new__:

  __new__(*args, **kwargs) from builtins.type
      Create and return a new object.  See help(type) for accurate signature.
Run Code Online (Sandbox Code Playgroud)

help(type)说了同样的话:

__new__(*args, **kwargs)
      Create and return a new object.  See help(type) for accurate signature.
Run Code Online (Sandbox Code Playgroud)

那么如何在类定义中self传递?__new__Row

  • 是通过*args吗?
  • 确实__new__有一些细微之处,其中它的签名可以与情境改变?
  • 或者,文档是否有误?

是否有可能查看源代码,tuple.__new__以便我可以自己查看答案?

我的问题不是这个问题的重复,因为在那个问题中,所有的讨论都是指__new__明确拥有selfcls作为第一个参数的方法.我想了解一下

  1. 为什么该tuple.__new__方法没有self或 …

python class subclass subclassing pyspark

5
推荐指数
1
解决办法
1716
查看次数