C++
C#
Dart
Наследование универсальности параметра:
#include <iostream> template <typename T> class Person { public: Person(T id, std::string name) : id{id}, name{name} { } void print() const { std::cout << "Id: " << id << "\tName: " << name << std::endl; } protected: T id; std::string name; }; template <typename T> class Employee: public Person<T> { public: Employee(T id, std::string name, std::string company) : Person<T>{id, name}, company{company} { } void print() const { Person<T>::print(); std::cout << "Works in " << company << std::endl; } private: std::string company; }; int main() { Employee<unsigned> bob{123, "Bob", "Google"}; bob.print(); // Id: 123 Name: Bob // Bob works in Google }
Явная типизация при наследовании:
#include <iostream> template <typename T> class Person { public: Person(T id, std::string name) : id{id}, name{name} { } void print() const { std::cout << "Id: " << id << "\tName: " << name << std::endl; } protected: T id; std::string name; }; class Employee: public Person<unsigned> { public: Employee(unsigned id, std::string name, std::string company) : Person{id, name}, company{company} { } void print() const { Person::print(); std::cout << name << " works in " << company << std::endl; } private: std::string company; }; int main() { Employee bob{123, "Bob", "Google"}; bob.print(); // Id: 123 Name: Bob // Bob works in Google }
Наследование универсальности параметра:
Employee<int> bob = new(123, "Bob", "Google"); bob.Print(); class Person<T> { T id; // идентификатор пользователя string name; // имя пользователя public Person(T id, string name) { this.id = id; this.name = name; } public virtual void Print() => Console.WriteLine($"id: {id} \t name: {name}"); } class Employee<T>: Person<T> { string company; public Employee(T id, string name, string company) :base(id, name) { this.company = company; } public override void Print() { base.Print(); Console.WriteLine($"Works in {company}"); } }
Явная типизация при наследовании:
Employee bob = new(123, "Bob", "Google"); bob.Print(); class Person<T> { T id; // идентификатор пользователя string name; // имя пользователя public Person(T id, string name) { this.id = id; this.name = name; } public virtual void Print() => Console.WriteLine($"id: {id} \t name: {name}"); } class Employee: Person<int> { string company; public Employee(int id, string name, string company) :base(id, name) { this.company = company; } public override void Print() { base.Print(); Console.WriteLine($"Works in {company}"); } }
Наследование универсальности параметра:
void main (){ Employee bob = Employee(123, "Bob", "Google"); bob.display(); } class Person<T>{ T id; // идентификатор пользователя String name; // имя пользователя Person(this.id, this.name); void display() => print("id: $id \t name: $name"); } class Employee<T> extends Person<T>{ String company; Employee(super.id, super.name, this.company); @override void display(){ super.display(); print("Works in $company"); } }
Явная типизация при наследовании:
void main (){ Employee bob = Employee(123, "Bob", "Google"); bob.display(); } class Person<T>{ T id; // идентификатор пользователя String name; // имя пользователя Person(this.id, this.name); void display() => print("id: $id \t name: $name"); } class Employee extends Person<int>{ String company; Employee(super.id, super.name, this.company); @override void display(){ super.display(); print("Works in $company"); } }