如何访问继承对象的字段

问题描述 投票:0回答:1

我了解如何使用继承来访问方法,但我不明白当对象的类型是父对象时如何访问子对象的字段

(我的问题纯粹是关于架构的,所以语言应该不重要,但仅供参考,我正在使用 Dart)

我有一个父对象和另外两个继承自它的对象:

class User {
   String id;
   String name;
}

class Person extends User {
   DateTime birthDate;
}

class Company extends User {
   String address;
}

当我必须访问父类对象上特定于子案例的这些字段时,我的问题就出现了。我的应用程序的登录用户类型为

User
,但根据类型,我将必须显示或编辑特定字段。

例如,在 ProfileView 中,

Person
用户应显示出生日期,
Company
用户应显示地址。 EditProfile 的情况也是如此。

这是我到目前为止的解决方案:

User user;

//Initialization and other code

if (user is Person) displayBirthDate();
else if (user is Company) displayAddress();

但这并没有利用继承的特性。

我的问题纯粹是概念性的,与语言无关:如何访问父类类型的对象中子类的字段?

dart inheritance architecture polymorphism
1个回答
0
投票

符合里氏替换原则(LSP)。

这就是您所做的,其中 LSP 声明 子类型必须可替换其父类型。

我不知道你的问题到底是什么,但它围绕着字段的访问。

假设您有一个接受用户作为参数的方法:

    void buildMyWidget(User user){
    
    if(user is Person){
    
    // dart analyzer detects the type, and let you access the Person fields
    }
    else if (user is Company){
    // same access for Company fields
    }
    else{
    //it's the parent
    }
}

您可以切换该对象以检测其类型。

此外,您甚至可以将该方法封装在父类中,并在子类型中重写它,这使您无需使用

if-else
switch
进行硬类型检查。

顺便说一句,我问了一个关于这一点的类似问题,但与小部件构建更多重叠。 这里

希望对您有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.