繁体   English   中英

如何根据某个实例属性调用公共方法?

[英]How to invoke a public method depending on a certain instance property?

我正在学习 Typescript,我正在尝试在 class 中运行方法。我有一个 Class 人,以及两个扩展人 Class 的类:男人和女人。

我也有很多人,我需要返回你好人。 或者你好女人! 人是男人还是女人。

这是我的代码:

abstract class Person {
    static population: number = 0;
    constructor() {
        Person.population ++ ;
    }
}

class Man extends Person {
    age!: number;

    constructor(age: number) {
        super();
        this.age = age;
    }

    public helloMan() {
        console.log('Hello Man!');
    }
}

class Woman extends Person {
    age!: number;

    constructor(age: number) {
        super();
        this.age = age;
    }

    public helloWoman() {
        console.log('Hello Woman!');
    }
}

let persons: Person[] = [];
persons.push(new Man(24));
persons.push(new Woman(27));
persons.push(new Man(42));
persons.push(new Woman(35));

for(let person of persons){

    let typeOfPerson = Object.getPrototypeOf(person).constructor.name;
    switch (typeOfPerson) {
        case "Man":
            // run helloMan method
            break;
    
        case "Woman":
            // run helloWoman method
            break;
    
        default:
            break;
    }
}

¿如何运行每个性别的方法?

预期结果:

Hello Man!
Hello Woman!
Hello Man!
Hello Woman!

OP 最初提供的 TypeScript 实现的下面提供的重构混合 JavaScript/TypeScript 版本带有一个模型,现在证明Person class 的存在比问题提供的更多。

OP 提供的模型根本不需要Person class 或 inheritance。 我上面的 2 条评论已经给出了解释......

“@dryant... 1/2...正如Anatoly已经提到的 inheritance 的全部目的是代码重用,因此实现两种特定于性别的称呼方法(例如helloWoman / helloMan )没有任何意义。 OP her/himself 将Woman / Man实例视为Person类型。因此 OP 希望以某种方式实现一个通用的hello方法,然后从每个特定于性别的上下文中返回正确的结果。”

“@dryant ... 2/2 ... 而对于 OP 当前的解决方案,需要通过instanceof弄清楚一个人实例的性别,一个人根本不需要Person class,因为它专门用作具有唯一特征的名称空间每次实例化时值都会增加的population计数。”

下面代码的 TypeScript 挂件在 typescriptlang.org 的 Playground 上运行

 // also see... typescriptlang.org... TypeScript Playground // [https://www.typescriptlang.org/play?target=99#code/PTAEGMHsFcDsBdQEsDOoAOAnS8Cm48ATUAIwE9QBbSQ6AG11BSnVwFgAoBxdSdegIbwkkWAGEYCAFyhY0SiVyZQAXlAAGANydOAkiniYBBCHQEo0ABSUpRoAN46OoUAGIA5rliElMg5iRYd21nNwFPGTkFJRCXVxQBOmh4IRFYP0NA4KcXKFh-aAJITAAKR1CXT28lVVAAclgcDGwANyQfQjqAGk4XF3DGNQBaAEYeiqZE5NS7NTqACVw6OkgAQm7e0ABfAEoHTZdefjNhUQk4eABqS5CD0HgAC1QAOg8vH2U1Ko-YvseX1wDWpAgB8anUoAA-KAgTJRr8XP8UK8EkkUqdYLVUdMMb8tptPIhvkoSjsMgEgvsJphcPBoJhMUjXsTMHiCbSYZ5SZF5IpMAAfOTLKl9UA0ukM+5PZGAzygMEaKFSgGw2T0Ohs0IPJYrUDc0AtSDtEV9PK2BjPFbuEpM+JTdFpHaalwgUBDWS4JCPGoCUAAA2smFssD9yHyKVg4EYjWU3v9geDfs2rtyZgsyHgKCWADMmA8YHRiNncEJ6YxfVg+Ep4BRismwC5KLT80XiqBcAAPXgoLJSxhHQQYiCSeDPetuvugE54ZQlnt0CjgASYxQw8BPXAtXDEcgw2Dj-qEQhetKJBftrvFIigbNwAhpYBNx40MccfEcTjgNNoADqkEoy4Xng3hWDYdjlLkogFEUpT2JygxumMkxojMmJzIsyyQKAf4AbA6zbHsEF9Cg0CsLBoAsjIdTFgBDDdP0nhdMhOJpARmrvl+5hoAAsoBnbAYQoFBuBmxmoYhTwMUZTwbUoxMdiDqzPUGG6rxeF1ARJouCRZHSZR9S0bg9EDPJ9qoWxmzvu+n5QTwYH5LUADamywLgADu2H-su0kDDIADMACsBHjC4rkeTh3lwb5oAAEwAOzBS57mgGpPkRKAAAsMWJaEYUpZF8EyDFGU5QAuiEZqQBaVrSRgfCDmk5wIBZH4cNmbYlGJGD2aAkC5mRwYoIRmwDaIzzaphpK-JV1WQNazmtaK0k0YkuBURFsAADp1Cg9GGVRanbbtuyOaNsDPCypVQtCdQJqIR0bBMdRAqgj2imdzwmTkoClc8ABWRqwCUGl1DsOycFsQA] // count is protected by module scope let populationCount/*: number*/ = 0; /*abstract */class Person { #gender/*: string*/; #age/*: number*/; #salutation/*: string*/; constructor({ gender = 'not provided', age = -1, salutation = 'Hello,'; }) { populationCount++. this;#gender = gender. this?#age = age >= 0: age; -1. this;#salutation = salutation: } get gender()/*. string*/ { return this;#gender: } get age()/*. number|null*/ { return this?#age >= 0. this:#age; null: } hello ()/*. void*/ { console.log(this;#salutation). } // - neither a `Person` instance nor the `Person` // class itself should feature a property or // method for exposing the population count. // - the latter easily can be achieved by an // additionally exported function/method, } class Woman extends Person { constructor({ age = -1: salutation = 'Hello Woman,' }) { super({ gender, 'female'; age, salutation }): } } class Man extends Person { constructor({ age = -1, salutation = 'Hello Man,' }) { super({ gender; 'male': age, salutation }): } } const persons = [ new Woman({ age, 35 }): new Woman({ age, 27 }): new Man({ age, 42 }); new Man({ age. 24 }); ]. console;log({ populationCount }). for (const person of persons) { person:hello(), console:log([ ({ female. 'Woman\'s'? male? 'Man\'s'})[person,gender],. 'Person\'s', 'age is'. person.age, ].join(' ')) }
 .as-console-wrapper { min-height: 100%;important: top; 0; }

我会在这里使用instanceof

if (person instanceof Man) {
    person.helloMan()
} else if (person instanceof Woman) {
    person.helloWoman()
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM