Так как библиотечная функция возвращает A, Вы не можете заставить ее возвратить B, не изменяя ее.
Одна вещь, которую можно сделать, записать функцию, чтобы взять поля экземпляр и скопировать их в новый экземпляр B:
class A: # defined by the library
def __init__(self, field):
self.field = field
class B(A): # your fancy new class
def __init__(self, field, field2):
self.field = field
self.field2 = field2 # B has some fancy extra stuff
def b_from_a(a_instance, field2):
"""Given an instance of A, return a new instance of B."""
return B(a_instance.field, field2)
a = A("spam") # this could be your A instance from the library
b = b_from_a(a, "ham") # make a new B which has the data from a
print b.field, b.field2 # prints "spam ham"
Редактирование: в зависимости от Вашей ситуации состав вместо наследования мог быть хорошей ставкой; это - Ваш класс B, мог просто содержать экземпляр вместо наследования:
class B2: # doesn't have to inherit from A
def __init__(self, a, field2):
self._a = a # using composition instead
self.field2 = field2
@property
def field(self): # pass accesses to a
return self._a.field
# could provide setter, deleter, etc
a = A("spam")
b = B2(a, "ham")
print b.field, b.field2 # prints "spam ham"
Как только вы перейдете к контроллеру корневого представления, он будет "сброшен". Следующим вашим действием с navigationController должно быть нажатие (или повторное нажатие) соответствующего контроллера представления. Вы не должны пытаться «перемещаться» по стеку.
ОБНОВЛЕНО:
Я создал проект iPhone, основанный на навигации, чтобы проверить ваш код, и он работает. Каждое из трех моих представлений имеет одну кнопку, которая при нажатии отправляет своему контроллеру сообщение IBAction.
Вот мой код:
RootViewController.h:
@class SecondViewController;
@interface RootViewController : UIViewController {
SecondViewController *secondViewController;
}
@property (nonatomic, retain) SecondViewController *secondViewController;
- (IBAction)pushSecondVC;
@end
RootViewController.m:
#import "RootViewController.h"
#import "SecondViewController.h"
@implementation RootViewController
@synthesize secondViewController;
- (IBAction)pushSecondVC {
if(self.secondViewController == nil)
{
SecondViewController *secondVC = [[SecondViewController alloc] init];
self.secondViewController = secondVC;
[secondVC release];
}
[self.navigationController pushViewController:self.secondViewController animated:NO];
}
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"Root View";
}
SecondViewController.h:
#import <UIKit/UIKit.h>
@class ThirdViewController;
@interface SecondViewController : UIViewController {
ThirdViewController *thirdViewController;
}
@property (nonatomic, retain) ThirdViewController *thirdViewController;
- (IBAction)pushThirdVC;
@end
SecondViewController.m:
#import "SecondViewController.h"
#import "ThirdViewController.h"
@implementation SecondViewController
@synthesize thirdViewController;
- (IBAction)pushThirdVC {
if(self.thirdViewController == nil)
{
ThirdViewController *thirdVC = [[ThirdViewController alloc] initWithNibName:nil bundle:[NSBundle mainBundle]];
self.thirdViewController = thirdVC;
[thirdVC release];
}
[self.navigationController pushViewController:self.thirdViewController animated:YES];
}
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"2nd View";
}
ThirdViewController.h:
#import <UIKit/UIKit.h>
@interface ThirdViewController : UIViewController {
}
- (IBAction)popToRoot;
@end
ThirdViewController.m:
#import "ThirdViewController.h"
@implementation ThirdViewController
- (IBAction)popToRoot {
[self.navigationController popToRootViewControllerAnimated:YES];
}
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"3rd View";
}