标签: subclass

什么是子类

什么是java中的"子类"?

我知道类和方法,但我不知道子类.

java oop subclass

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

Swift + CoreData:无法在生成的NSManagedObject子类上自动设置可选属性

我有一个名为Record的coredata实体,并且有一个属性dateUpdated.我注意到生成的NSManagedObject子类没有可选标记(?)

CoreData编辑器:

在此输入图像描述

生成的子类:

在此输入图像描述

预期:

在此输入图像描述

更新: 这是乏味的在我的部分,因为我想再生子类每一次,这意味着我还需要手动更新所有可选值.在子类中使用非可选(不带'?')会导致我在分配之前检查evalue,如下例所示:

// sample value:
// serverDateFormatter = "yyyy/MM/dd"
// dateString = ""    

// Branch is a subclass of Record (see above images)

var date = self.coreData.serverDateFormatter.dateFromString(dateString)
if date != nil
{
   branch.dateUpdated = date 
}
Run Code Online (Sandbox Code Playgroud)

但是如果xcode可以在子类中使用(?)自动设置可选值,我只需要这样做:

branch.dateUpdated = self.coreData.serverUTCDateFormatter.dateFromString(dateString)
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我有一堆属性需要手动标记为可选.

subclass nsmanagedobject ios swift

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

子类化Python字典以覆盖__setitem__

我正在构建一个子类dict和覆盖的类__setitem__.我想确定我的方法将在可能设置字典项的所有实例中被调用.

我发现了三种情况,Python(在这种情况下,2.6.4)__setitem__在设置值时不会调用我的重写方法,而是PyDict_SetItem直接调用

  1. 在构造函数中
  2. setdefault方法中
  3. update方法中

作为一个非常简单的测试:

class MyDict(dict):
    def __setitem__(self, key, value):
        print "Here"
        super(MyDict, self).__setitem__(key, str(value).upper())

>>> a = MyDict(abc=123)
>>> a['def'] = 234
Here
>>> a.update({'ghi': 345})
>>> a.setdefault('jkl', 456)
456
>>> print a
{'jkl': 456, 'abc': 123, 'ghi': 345, 'def': '234'}
Run Code Online (Sandbox Code Playgroud)

您可以看到仅在显式设置项时才调用重写的方法.为了让Python始终调用我的__setitem__方法,我不得不重新实现这三种方法,如下所示:

class MyUpdateDict(dict):
    def __init__(self, *args, **kwargs):
        self.update(*args, **kwargs)

    def __setitem__(self, key, value):
        print "Here"
        super(MyUpdateDict, self).__setitem__(key, value)

    def update(self, *args, **kwargs): …
Run Code Online (Sandbox Code Playgroud)

python dictionary subclass

42
推荐指数
1
解决办法
3万
查看次数

子类dict:UserDict,dict还是ABC?

什么之间的区别UserDict,dictABC和建议哪一种?文档似乎已经弃用了UserDict

似乎UserDict update()会使用我的setitem方法,而dict不是?在我想要自定义setitemgetitem功能的情况下,哪些方法是非常重要的?

使用ABCs我必须实现绝对所有方法,因为它没有提供默认实现?

我想做一dict件事做两件事:

  • intern() 所有键和值
  • 将一些值存储在SQLite数据库中

所以其中UserDict,dictABC能最好地让我做到这一点?

python subclass

41
推荐指数
1
解决办法
1万
查看次数

Swift子类 - 如何覆盖Init()

我有以下类,使用init方法:

class user {
  var name:String
  var address:String

  init(nm: String, ad: String) {
    name = nm
    address = ad
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试子类化这个类,但我不断收到错误super.init():

class registeredUser : user {
     var numberPriorVisits: Int

     // This is where things start to go wrong - as soon as I type 'init' it 
     // wants to autocomplete it for me with all of the superclass' arguments, 
     // and I'm not sure if those should go in there or not:
     init(nm: String, ad: String) { …
Run Code Online (Sandbox Code Playgroud)

initialization subclass superclass swift

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

理解__init_subclass__

我终于升级了我的python版本,我发现了添加的新功能.除此之外,我正在摸索新__init_subclass__方法.来自文档:

只要包含类被子类化,就会调用此方法.然后cls是新的子类.如果定义为普通实例方法,则此方法将隐式转换为类方法.

所以我开始尝试一下,按照文档中的示例:

class Philosopher:
    def __init_subclass__(cls, default_name, **kwargs):
        super().__init_subclass__(**kwargs)
        print(f"Called __init_subclass({cls}, {default_name})")
        cls.default_name = default_name

class AustralianPhilosopher(Philosopher, default_name="Bruce"):
    pass

class GermanPhilosopher(Philosopher, default_name="Nietzsche"):
    default_name = "Hegel"
    print("Set name to Hegel")

Bruce = AustralianPhilosopher()
Mistery = GermanPhilosopher()
print(Bruce.default_name)
print(Mistery.default_name)
Run Code Online (Sandbox Code Playgroud)

生成此输出:

Called __init_subclass(<class '__main__.AustralianPhilosopher'>, 'Bruce')
'Set name to Hegel'
Called __init_subclass(<class '__main__.GermanPhilosopher'>, 'Nietzsche')
'Bruce'
'Nietzsche'
Run Code Online (Sandbox Code Playgroud)

我知道这个方法是子类定义之后调用的,但我的问题特别是关于这个特性的用法.我也阅读了PEP 487文章,但对我没什么帮助.这种方法在哪里有用?是为了:

  • 在创建时注册子类的超类?
  • 强制子类在定义时设置字段?

另外,我是否需要了解它__set_name__以充分理解其用法?

python metaclass class subclass python-3.6

41
推荐指数
4
解决办法
1万
查看次数

如何通过使用超类来减少代码?

我想重构一些目前由超类和两个子类组成的代码.

这些是我的课程:

public class Animal {
    int a;
    int b;
    int c;
}

public class Dog extends Animal {
    int d;
    int e;
}

public class Cat extends Animal {
    int f; 
    int g;
}
Run Code Online (Sandbox Code Playgroud)

这是我目前的代码:

ArrayList<Animal> listAnimal = new ArrayList<>();

if (condition) {
    Dog dog = new Dog();
    dog.setA(..);
    dog.setB(..);
    dog.setC(..);
    dog.setD(..);
    dog.setE(..);   
    listAnimal.add(dog);

} else {
    Cat cat = new Cat();
    cat.setA(..);
    cat.setB(..);
    cat.setC(..);
    cat.setF(..);
    cat.setG(..);
    listAnimal.add(cat);
}
Run Code Online (Sandbox Code Playgroud)

如何重构有关公共属性的代码?

我想要这样的东西:

Animal animal = new Animal();
animal.setA(..);
animal.setB(..);
animal.setC(..); …
Run Code Online (Sandbox Code Playgroud)

java inheritance subclass superclass

39
推荐指数
3
解决办法
1868
查看次数

覆盖@property setter和无限循环

有A类:

@interface ClassA : NSObject {
}
@property (nonatomic, assign) id prop1;
@end

@implementation
@synthesize prop1;
@end
Run Code Online (Sandbox Code Playgroud)

然后我有子类

@interface ClassB : ClassA {
}
@end

@implementation

- (id)init {
    self = [super init];
    if (self) {
    }
    return self;
}

//This is infinite loop
- (void) setProp1:(id)aProp
{
    self.prop1 = aProp;
}
@end
Run Code Online (Sandbox Code Playgroud)

这是无限循环,因为ClassB中的setProp1从ClassB中调用[ClassB setProp1:val].

我已经尝试过调用[super setProp1]但是这个

如何覆盖@property并在覆盖的setter中分配值?我们假设我无法修改ClassA.

overriding subclass objective-c ios

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

iOS:UIView子类init或initWithFrame:?

我做了一个UIView具有固定框架的子类.那么,我可以覆盖init而不是initWithFrame:吗?例如:

- (id)init {
    if ((self = [super initWithFrame:[[UIScreen mainScreen] bounds]])) {
        self.backgroundColor = [UIColor clearColor];
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

Xcode文档-initWithFrame:说:"如果以编程方式创建视图对象,则此方法是类的指定初始化程序UIView.子类可以重写此方法以执行任何自定义初始化,但必须super在其实现开始时调用."

"指定初始化程序"是什么意思?

subclass init uikit uiview ios

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

在Swift中对NSObject进行子类化 - 使用初始化器进行最佳实践

这是一个示例类的布局,有人可以指导我在创建NSObject的子类时的最佳实践吗?

class MyClass: NSObject {

    var someProperty: NSString! = nil

    override init() {
        self.someProperty = "John"
        super.init()
    }

    init(fromString string: NSString) {
        self.someProperty = string
        super.init()
    }

}
Run Code Online (Sandbox Code Playgroud)

这是正确的,我在这里遵循最佳做法吗?

我想知道我是否正确设置了初始化器(一个将字符串设置为默认值,一个我可以传入一个字符串)?

我应该super.init()在每个初始化器的末尾调用吗?

我的更具体(带字符串的那个)初始化器是否应该self.init()在最后调用而不是super.init()

在子类化时,在Swift中设置初始值设定项的正确方法是什么NSObject? - 我该如何调用super init?

这个问题(尽管在目标C中)建议你应该有一个init,你总是调用它,只需在更具体的内容中设置属性:Objective-C Multiple Initialisers

initialization subclass nsobject ios swift

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