constructors

This commit is contained in:
Timo Hocker 2020-05-10 16:07:27 +02:00
parent d6f2d44eaf
commit b9c03f8207
15 changed files with 257 additions and 1 deletions

View File

@ -13,13 +13,14 @@ Lessons:
- [instanciating objects, accessing attributes and methods](./lessons/Instances.md) - [instanciating objects, accessing attributes and methods](./lessons/Instances.md)
- [creating a class](./lessons/Classes.md) - [creating a class](./lessons/Classes.md)
- [constructors](./lessons/Constructors.md)
Work in progress: Work in progress:
- constructors
- encapsulation - encapsulation
- getter / setter / property - getter / setter / property
- inheritance - inheritance
- polymorphism - polymorphism
- virtual classes - virtual classes
- interfaces - interfaces
- Factories

View File

@ -0,0 +1,6 @@
# Constructors in C++
## Relevant files
- [car.h](./car.h)
- [car.cpp](./car.cpp)

23
cpp/constructors/car.cpp Normal file
View File

@ -0,0 +1,23 @@
// include the header file
#include "car.h"
// include necessary libraries and namespaces
#include <iostream>
#include <string>
using namespace std;
// define the implementation for car.print_info()
void car::print_info()
{
cout << "Car Information:" << endl;
// fields that are defined in the header file can just be used like normal variables here
cout << "- manufacturer: " << manufacturer << endl;
cout << "- model: " << model << endl;
}
car::car(string manufacturer, string model) {
// set manufacturer of the current object to the given manufacturer
this->manufacturer = manufacturer;
// set model of the current object to the given model
this->model = model;
}

22
cpp/constructors/car.h Normal file
View File

@ -0,0 +1,22 @@
#pragma once
// including a necessary library and namespace to work with strings
#include <string>
using namespace std;
// define the class
class car
{
private:
// define two fields, manufacturer and model
// this time as private to make the data only settable through the constructor or other local functions
std::string manufacturer;
std::string model;
public:
// define the constructor, taking manufacturer and model as parameters
car(std::string manufacturer, std::string model);
// define a method that will print out information
void print_info();
};

15
cpp/constructors/main.cpp Normal file
View File

@ -0,0 +1,15 @@
#include "car.h"
#include <cstring>
int main() {
// create a new car and store it in the variable 'a'
// The constructor requires manufacturer and model to be specified.
car a("Benz", "Velo");
// do the same for a second car
car b("Ford", "Model T");
// use a function of the car class to print out the information
a.print_info();
b.print_info();
}

View File

@ -0,0 +1,23 @@
public class Car {
// define the fields as private to prevent outside classes from accessing them
// access restriction will be a topic in the next lesson
private String model = "";
private String manufacturer = "";
// define the constructor
// in java a constructor is basically a function without return type named exactly like the class
public Car(String manufacturer, String model) {
// set manufacturer of the current object to the given manufacturer
this.manufacturer = manufacturer;
// set model of the current object to the given model
this.model = model;
}
// create the method print_info()
public void print_info() {
System.out.println("Car Information:");
System.out.println("- manufacturer: " + this.manufacturer);
System.out.println("- model: " + this.model);
}
}

View File

@ -0,0 +1,6 @@
# Java example
Relevant files:
- [main.java](./main.java)
- [car.java](./car.java)

View File

@ -0,0 +1,14 @@
public class main {
public static void main(String[] args) {
// create a new car and store it in the variable 'a'
// the constructor requires manufacturer and model to be specified
Car a = new Car("Benz", "Velo");
// do the same for a second car
Car b = new Car("Ford", "Model T");
// use a function of the car class to print out the information
a.print_info();
b.print_info();
}
}

14
lessons/Constructors.md Normal file
View File

@ -0,0 +1,14 @@
# Constructors
Constructors are a way to give data to an object right when it gets created. The
object can also run functions on that data during construction.
Constructors should only be used to initialize data which the object needs to
function.
## Code examples and language specific explanations
- [Java](../java/constructors/README.md)
- [Rust](../rust/constructors/README.md)
- [C++](../cpp/constructors/README.md)
- [JavaScript (using TypeScript)](../typescript/constructors/README.md)

14
rust/Constructors.md Normal file
View File

@ -0,0 +1,14 @@
# Constructors in rust
Rust is a special case for constructors. The language itself is already
different from most other languages in structure, especially for object oriented
programming.
Simply said, there are no constructors in rust. When you create an object, you
have to initialize all data immediately and by yourself.
You can look into the classes or instances examples to see how object
construction is done in rust.
- [main.rs](./classes/src/main.rs)
- [car.rs](./classes/src/car.rs)

View File

@ -0,0 +1,6 @@
# Typescript Example
## Relevant Files
- [index.ts](./index.ts)
- [car.ts](./car.ts)

View File

@ -0,0 +1,23 @@
/**
* the class is defined with the export keyword to make it usable outside of the current file
*/
export class Car {
// define the fields
// setting them to private to prevent access from outside
private manufacturer: string = '';
private model: string = '';
// in typescript constructors are defined with the keyword constructor
public constructor(manufacturer: string, model: string) {
// set manufacturer and model of the current object to the given parameters
this.manufacturer = manufacturer;
this.model = model;
}
// define the method print_info
print_info() {
console.log('Car Information:');
console.log(`- manufacturer: ${this.manufacturer}`);
console.log(`- model: ${this.model}`);
}
}

View File

@ -0,0 +1,12 @@
import {Car} from './car'
// create a new car and store it in the variable 'a'
// the constructor requires the parameters for model and manufacturer
const a = new Car('Benz','Velo');
// do the same for a second car
const b = new Car('Ford','Model T');
// use a function of the car class to print out the information
a.print_info();
b.print_info();

View File

@ -0,0 +1,11 @@
{
"name": "ts-oop",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}

View File

@ -0,0 +1,66 @@
{
"compilerOptions": {
/* Basic Options */
// "incremental": true, /* Enable incremental compilation */
"target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
// "lib": [], /* Specify library files to be included in the compilation. */
// "allowJs": true, /* Allow javascript files to be compiled. */
// "checkJs": true, /* Report errors in .js files. */
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
// "declaration": true, /* Generates corresponding '.d.ts' file. */
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
// "sourceMap": true, /* Generates corresponding '.map' file. */
// "outFile": "./dist", /* Concatenate and emit output to single file. */
"outDir": "./dist", /* Redirect output structure to the directory. */
// "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
// "composite": true, /* Enable project compilation */
// "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
// "removeComments": true, /* Do not emit comments to output. */
// "noEmit": true, /* Do not emit outputs. */
// "importHelpers": true, /* Import emit helpers from 'tslib'. */
// "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
// "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
/* Strict Type-Checking Options */
"strict": true, /* Enable all strict type-checking options. */
// "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
// "strictNullChecks": true, /* Enable strict null checks. */
// "strictFunctionTypes": true, /* Enable strict checking of function types. */
// "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
// "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
// "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
// "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
/* Additional Checks */
// "noUnusedLocals": true, /* Report errors on unused locals. */
// "noUnusedParameters": true, /* Report errors on unused parameters. */
// "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
/* Module Resolution Options */
// "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
// "typeRoots": [], /* List of folders to include type definitions from. */
// "types": [], /* Type declaration files to be included in compilation. */
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
"esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
/* Source Map Options */
// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
// "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
/* Experimental Options */
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
/* Advanced Options */
"forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
}
}