This commit is contained in:
Timo Hocker 2020-05-03 15:12:03 +02:00
parent 8143d66e49
commit f5c60a26f2
19 changed files with 340 additions and 9 deletions

View File

@ -16,7 +16,6 @@ Lessons:
Work in progress: Work in progress:
- use attributes or functions from a function within an object
- constructors - constructors
- encapsulation - encapsulation
- getter / setter / property - getter / setter / property

9
cpp/classes/README.md Normal file
View File

@ -0,0 +1,9 @@
# Classes in C++
In c++ classes are defined using a header file and the implementation in a
regular .cpp file. Explanations to the structure can be found in the files themselves
## Relevant files
- [car.h](./car.h)
- [car.cpp](./car.cpp)

23
cpp/classes/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;
}
/*
That's everything for the .cpp file.
Since fields don't have an implementation and are already defined in the header file, they can be left out here.
*/

40
cpp/classes/car.h Normal file
View File

@ -0,0 +1,40 @@
// #pragma once is usually included in header files to make sure they are only loaded once
// it's a simpler version of include guards, which are necessary to prevent conflicts
#pragma once
/*
in case #pragma once is not supported by your compiler you'll need more basic include guards
in this case it would be
#ifndef car_h
#define car_h
...class contents
#endif
*/
// including a necessary library and namespace to work with strings
#include <string>
using namespace std;
// define the class
class car
{
// define the visibility of the following fields and methods
// in this case everything is public since visibility is a topic in future lessons
public:
// define two strings, manufacturer and model
std::string manufacturer;
std::string model;
// define a function that will print out information
void print_info();
};
/*
That completes the header file, as you can see, there are no implementations in here.
That's because they will be added in the car.cpp file.
*/

20
cpp/classes/main.cpp Normal file
View File

@ -0,0 +1,20 @@
#include "car.h"
#include <cstring>
int main() {
// create a new car and store it in the variable 'a'
// in contrast to java, c++ does not need initialization with the 'new' keyword here.
car a;
// set some data for that car
a.manufacturer = "Benz";
a.model = "Velo";
// do the same for a second car
car b;
b.manufacturer = "Ford";
b.model = "Model T";
// use a function of the car class to print out the information
a.print_info();
b.print_info();
}

18
java/classes/Car.java Normal file
View File

@ -0,0 +1,18 @@
/**
* this class is also declared with the public keyword to make it accessible
* outside of the current file
*/
public class Car {
public String model = "";
public String manufacturer = "";
public void print_info() {
System.out.println("Car Information:");
/**
* To access fields of the current object the this keyword is used. It is
* possible to omit that keyword, but it's recommended to be used anyways.
*/
System.out.println("- manufacturer: " + this.manufacturer);
System.out.println("- model: " + this.model);
}
}

5
java/classes/README.md Normal file
View File

@ -0,0 +1,5 @@
# Java Example
Relevant Files:
- [Car.java](./Car.java)

18
java/classes/main.java Normal file
View File

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

View File

@ -1,14 +1,25 @@
# Creating Classes # Creating Classes
This lesson is going to use the same code from last time to explain This lesson is going to use the same code from last time to explain the class
the class structure itself. structure itself.
Since the example languages can have quite different styles of Since the example languages can have quite different styles of class
class declaration, I will just give a basic explanation here and then declaration, I will just give a basic explanation here and then discuss every
discuss every language in detail in their own description file. language in detail in their own description file.
Classes are blueprints for the objects you create. You define how the Classes are blueprints for the objects you create. You define how the object
object will look like and more importantly for the computer how much will look like and more importantly for the computer how much space it will use
space it will use in memory. in memory.
The main parts of a class are fields and methods. One for storing data and one
for processing that data. Fields are placed at the top of the class and look
like general variable declarations. Methods can take in arguments and also use
the fields declared in the class. They can modify data in the object or just
return some data to the caller.
## Code examples and language specific explanations
- [Java](../java/classes/README.md)
- [Rust](../rust/classes/README.md)
- [C++](../cpp/classes/README.md)
- [JavaScript (using TypeScript)](../typescript/classes/README.md)

5
rust/classes/Cargo.lock generated Normal file
View File

@ -0,0 +1,5 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
[[package]]
name = "rust-oop"
version = "0.1.0"

9
rust/classes/Cargo.toml Normal file
View File

@ -0,0 +1,9 @@
[package]
name = "rust-oop"
version = "0.1.0"
authors = ["Timo Hocker <t-hocker@web.de>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

11
rust/classes/README.md Normal file
View File

@ -0,0 +1,11 @@
# Classes in Rust
Rust doesn't have classes like Java or other typical c style languages. Instead
there are Structs and Traits.
Structs are responsible for storing data and nothing else. Traits define
functions that can be used.
## Relevant Files
- [car.rs](./src/car.rs)

27
rust/classes/src/car.rs Normal file
View File

@ -0,0 +1,27 @@
/*
* Define the trait Information that will contain the function print_info()
*/
pub trait Information {
// define the function, &self is an argument that will be autofilled
// when running the function and it will reference the current object
fn print_info(&self);
}
/*
* Define the struct Car, which will hold all the necessary information
*/
pub struct Car {
pub manufacturer: String,
pub model: String
}
/*
* Implementing the trait Information for the struct Car
*/
impl Information for Car {
fn print_info(&self) {
println!("Car Information:");
println!("- manufacturer: {}", self.manufacturer);
println!("- model: {}", self.model);
}
}

23
rust/classes/src/main.rs Normal file
View File

@ -0,0 +1,23 @@
mod car;
use car::Information;
fn main() {
// create a new car and store it in the variable 'a'
// rust also doesn't use the 'new' keyword
// all attributes have to be defined upon creation of the object
let a = car::Car {
// set some data for that car
manufacturer: "Benz".to_string(),
model: "Velo".to_string()
};
// do the same for a second car
let b = car::Car {
manufacturer: "Ford".to_string(),
model: "Model T".to_string()
};
// use a function of the car class to print out the information
a.print_info();
b.print_info();
}

View File

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

15
typescript/classes/car.ts Normal file
View File

@ -0,0 +1,15 @@
/**
* the class is defined with the export keyword to make it usable outside of the current file
*/
export class Car {
// define the fields
manufacturer: string = '';
model: string = '';
// define the function print_info
print_info() {
console.log('Car Information:');
console.log(`- manufacturer: ${this.manufacturer}`);
console.log(`- model: ${this.model}`);
}
}

View File

@ -0,0 +1,16 @@
import {Car} from './car'
// create a new car and store it in the variable 'a'
const a = new Car();
// set some data for that car
a.manufacturer = 'Benz';
a.model = 'Velo';
// do the same for a second car
const b = new Car();
b.manufacturer = 'Ford';
b.model = '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. */
}
}