2016-02-29 3 views
10

Почему класс, не имеющий тип ввода, имеет одно и то же имя переменной? Даже эти члены являются частными. Есть ли альтернатива этому, или я делаю что-то неправильно?Тип производного типа не может иметь одинаковое имя переменной?

class ClassTS { 

    private nom: string = "ClaseTS"; 

    constructor() { 

    } 
} 

class ClassTSDer extends ClassTS { 

    private nom: string = "ClassTS"; 

    constructor() { 
     super(); 
    } 
} 

Я нашел это, практикуя с TS.

Класс «ClassTSDer» неправильно расширяет базовый класс «ClaseTS». Типы имеют отдельные декларации частной собственности 'nom'. ClassTSDer

класс ClassTSDer

вы можете, использовать защищенный; да, но если я не хочу использовать защищенные, мне нужно будет использовать другое имя?

+0

Не «хотя», но потому что есть частные и не имеют одинаковых имен. U хочет переопределить частное свойство (дочерний класс с тем же свойством, что и в родительском классе, всегда хочет переопределить это). – Szymon

+0

«Вы могли бы использовать protected» => У меня не было боли, устанавливая его для публики в родительском и дочернем классе, и он работает: D – Guntram

ответ

19

Свойства должны иметь разные названия.

Помните, что во время выполнения экземпляры класса JavaScript представляют собой просто объекты, а объекты - это просто сопоставления от ключа к значению. Имена свойств - это ключ, и у вас не может быть двух разных ключей с тем же именем.

+2

Спасибо за ответ, я думал, что делаю что-то неправильно. или, возможно, для этого было зарезервированное слово, ваше объяснение коротким, простым и очень полезным спасибо за ваше время. –

8

Свойства должны иметь разные названия.

Если вы посмотрите на сгенерированный код ES5, вы увидите, что объявление свойства в дочернем классе с тем же именем, что и частное свойство, так как родитель будет перезаписывать родительский, тем самым нарушая инкапсуляцию.

/** 
* ClassTS 
*/ 
var ClassTS = (function() { 
    function ClassTS() { 
     this.nom = "ClaseTS"; 
    } 
    ClassTS.prototype.someMethod = function() { 
     console.log(this.nom); 
    }; 
    return ClassTS; 
}()); 
/** 
* ClassTSDer 
*/ 
var ClassTSDer = (function (_super) { 
    __extends(ClassTSDer, _super); 
    function ClassTSDer() { 
     _super.call(this); 
     this.nom = "ClassTS"; 
    } 
    ClassTSDer.prototype.childMethod = function() { 
     _super.prototype.someMethod.call(this); 
    }; 
    return ClassTSDer; 
}(ClassTS)); 

В этом случае для любой функции от родителя называется у ребенка приведет к this.nom, имеющему значение «ClassTS» вместо «ClaseTs», как вы могли бы ожидать от частной собственности ,

Компилятор не жалуется на свойства (хотя они генерируют тот же код ES5), потому что ожидания инкапсуляции больше не существуют.

+1

Спасибо, что ответили, я думал, что делаю что-то неправильно. или, может быть, было зарезервированное слово для этого, вы говорите ... Компилятор не жалуется на защищенные ... я не знал, спасибо за ваше время –

Смежные вопросы