Commit 0601a292 authored by Uwe Wienkop's avatar Uwe Wienkop

2020-05-20

parent ce25fe8d
......@@ -4,7 +4,7 @@ namespace _05_InterfaceIntro
{
interface IBesteuerbareObjekte
{
double Steuern();
/* public abstract */double Steuern();
}
interface IVerkaufbareObjekte
{
......@@ -12,37 +12,60 @@ namespace _05_InterfaceIntro
}
abstract class Kfz : IBesteuerbareObjekte, IVerkaufbareObjekte
// abstract:
// 1) Von dieser Klasse können keine Objekte angelegt werden (manchmal eine wünschenswerte Eigenschaft)
// 2) Die Klasse enthält eine oder mehrere abstrakte Methode(n) und muss deshalb als abstract def. werden
{
public abstract double Steuern();
public abstract void Verkaufen();
public abstract double Steuern(); // Steuern() und Verkaufen() müssen wieder als abstrakt definiert sein,
public abstract void Verkaufen(); // da ansonsten die Interface-Klassen nicht implementiert werden
public void TueEtwas() { }
}
class Pkw : Kfz
{
double hubraum;
// Steuern() und Verkaufen() müssen in dieser nicht-abstrakten Klasse implementiert
// werden, da ansonsten nicht alle abstrakten Methoden implementiert sind
public override double Steuern() => (hubraum + 99) / 100 * 9.50;
public override void Verkaufen()
{
Console.WriteLine("PKW wird verkauft");
TueEtwas();
}
}
class Pflanzen : IVerkaufbareObjekte
{
public void Verkaufen()
{
Console.WriteLine("Pflanze wird verkauft");
}
}
class Immobilien : IBesteuerbareObjekte, IVerkaufbareObjekte
{
// Steuern() und Verkaufen() müssen direkt implementiert werden, da ansonsten
// nicht alle abstrakten Methoden implementiert sind
public double Steuern() => 1000;
public void Verkaufen() { Console.WriteLine("Haus wird verkauft"); }
}
class Program
{
static void Main(string[] args)
{
IBesteuerbareObjekte[] bObj = new IBesteuerbareObjekte[2];
IBesteuerbareObjekte[] bObj = new IBesteuerbareObjekte[3];
Immobilien i1 = new Immobilien();
Pkw p1 = new Pkw();
bObj[0] = i1;
bObj[1] = p1;
//bObj[2] = new Pflanzen();
IVerkaufbareObjekte[] vObj = new IVerkaufbareObjekte[2];
vObj[0] = i1;
vObj[1] = p1;
vObj[2] = new Pflanzen();
//i1.Verkaufen();
i1.Steuern();
......
......@@ -16,6 +16,10 @@ namespace _05_UebgDi_Warenwirtschaft
// Legen Sie in Main() ein Feld mit einem Objekt je Klasse an, geben Sie alle Elemente in einer Schleife aus
// und schreiben Sie eine Methode, die z.B. nach der Pflanze über den Namen sucht und dieses Objekt zurückliefert
// Rufen Sie dann für die Pflanze diese besondere Methode auf.
interface IBegiessbar
{
void Gießen();
}
abstract class Produkt
{
int stueckzahl;
......@@ -41,7 +45,7 @@ namespace _05_UebgDi_Warenwirtschaft
public Gartenprodukte(int stückzahl, double preis, string name)
: base(stückzahl, preis, name) { }
}
class Pflanzen : Gartenprodukte
class Pflanzen : Gartenprodukte, IBegiessbar
{
public enum Pflanzentyp { zier, nutz};
Pflanzentyp typ;
......@@ -52,37 +56,56 @@ namespace _05_UebgDi_Warenwirtschaft
}
public void Gießen() { }
}
class Froesche : Produkt ,IBegiessbar
{
public Froesche(int stückzahl, double preis, string name)
: base(stückzahl, preis, name) { }
public void Gießen()
{
Console.WriteLine("Frosch wird begossen");
}
}
class Program
{
static void Main(string[] args)
{
Produkt[] produkte = new Produkt[3];
Produkt[] produkte = new Produkt[4];
produkte[0] = new Pflanzen(10, 0.35, "Geranien", Pflanzen.Pflanzentyp.zier);
produkte[1] = new Pflanzen(10, 0.55, "Salat", Pflanzen.Pflanzentyp.nutz);
produkte[2] = new Pflanzen(10, 0.55, "Karotten", Pflanzen.Pflanzentyp.nutz);
produkte[2] = new Froesche(100, 2.49, "Hopper");
produkte[3] = new Pflanzen(10, 0.55, "Karotten", Pflanzen.Pflanzentyp.nutz);
foreach (Produkt item in produkte)
{
if (item.Name == "Geranien")
{
// item.Gießen(); -- Geht nicht, da der statische Typ die aufrufbaren Methoden def.
#region Typkonvertierungen
//if (item.Name == "Geranien")
//{
// // item.Gießen(); -- Geht nicht, da der statische Typ die aufrufbaren Methoden def.
((Pflanzen) item).Gießen();
// Typ-cast ~ item wird in eine Pflanzen-Referenz konvertiert. Falls dies nicht
// möglich ist, wird eine Exception geworfen
// ((Pflanzen) item).Gießen();
// // Typ-cast ~ item wird in eine Pflanzen-Referenz konvertiert. Falls dies nicht
// // möglich ist, wird eine Exception geworfen
(item as Pflanzen).Gießen();
Pflanzen p1 = item as Pflanzen;
if (p1 != null)
p1.Gießen();
// as ~ versuche item in eine Pflanzen-Referenz zu konvertieren. Falls dies nicht
// möglich ist, wird null zurückgegeben.
// (item as Pflanzen).Gießen();
// Pflanzen p1 = item as Pflanzen;
// if (p1 != null)
// p1.Gießen();
// // as ~ versuche item in eine Pflanzen-Referenz zu konvertieren. Falls dies nicht
// // möglich ist, wird null zurückgegeben.
// if (item is Pflanzen) { }
// // Testet, ob item in Pflanzenreferenz konvertierbar ist => bool-Ergebnis
// if (item is Pflanzen p2)
// p2.Gießen();
// // Im Erfolgsfall befindet sich in p2 die Pflanzen-Referenz
//}
#endregion
//if (item is Pflanzen p2)
// p2.Gießen();
//if (item is Froesche f2)
// f2.Gießen();
if (item is IBegiessbar it2)
it2.Gießen();
if (item is Pflanzen) { }
// Testet, ob item in Pflanzenreferenz konvertierbar ist => bool-Ergebnis
if (item is Pflanzen p2)
p2.Gießen();
// Im Erfolgsfall befindet sich in p2 die Pflanzen-Referenz
}
}
}
}
......
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{BF8BDB6A-FA4E-4BDF-9375-78C886EA82F5}</ProjectGuid>
<OutputType>Exe</OutputType>
<RootNamespace>_06Ausnahmen</RootNamespace>
<AssemblyName>06Ausnahmen</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
</configuration>
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _06Ausnahmen
{
class MeineFehlerKlasse : ArgumentOutOfRangeException
{
public int fehlerwert;
public MeineFehlerKlasse(string Fehlertext, int Fehlerwert)
: base(Fehlertext)
{ fehlerwert = Fehlerwert; }
}
class Program
{
static void funktion()
{
if (1 < 2)
throw new MeineFehlerKlasse("Argumente außerhalb des Wertebereichs",2);
}
static void Main(string[] args)
{
try
{
try
{
// Datei öffnen
funktion();
// Datei lesen
// Datei schließen
}
// Bei den Catches:
// Die spezifischeren Catches müssen vor den allgemeineren Catches stehen
catch (MeineFehlerKlasse e)
{
Console.WriteLine($"Fehler: {e.Message}, {e.fehlerwert }");
throw; // throw (ohne Parameter) wirft das gefangene Fehlerobjekt weiter
// an den übergeordneten try-catch-Block
}
catch (ArgumentOutOfRangeException)
{
Console.WriteLine("Argumente haben den falschen Wertebereich");
}
finally
{
Console.WriteLine("Dieser Code wird immer ausgeführt");
// Zum Beispiel Dateien schließen, Ressourcen freigeben
// Bei ...
// Fehlerfreier Ausführung des try-Blocks
// Fehlerhafter Ausführung des try-Blockks mit und ohne catch
// (auch mit weiterem throw)
}
}
catch (Exception)
{
Console.WriteLine("Sonstiger Fehler");
}
}
}
}
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// Allgemeine Informationen über eine Assembly werden über die folgenden
// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
// die einer Assembly zugeordnet sind.
[assembly: AssemblyTitle("06Ausnahmen")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("06Ausnahmen")]
[assembly: AssemblyCopyright("Copyright © 2018")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly
// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von
// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen.
[assembly: ComVisible(false)]
// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
[assembly: Guid("bf8bdb6a-fa4e-4bdf-9375-78c886ea82f5")]
// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
//
// Hauptversion
// Nebenversion
// Buildnummer
// Revision
//
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
// übernehmen, indem Sie "*" eingeben:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
</configuration>
\ No newline at end of file
C:\Users\TH-Nürnberg\Source\Repos\Prog2-SS2018-Wienkop2\Prog2_SS2018\06Ausnahmen\bin\Debug\06Ausnahmen.exe.config
C:\Users\TH-Nürnberg\Source\Repos\Prog2-SS2018-Wienkop2\Prog2_SS2018\06Ausnahmen\bin\Debug\06Ausnahmen.exe
C:\Users\TH-Nürnberg\Source\Repos\Prog2-SS2018-Wienkop2\Prog2_SS2018\06Ausnahmen\bin\Debug\06Ausnahmen.pdb
C:\Users\TH-Nürnberg\Source\Repos\Prog2-SS2018-Wienkop2\Prog2_SS2018\06Ausnahmen\obj\Debug\06Ausnahmen.csproj.CoreCompileInputs.cache
C:\Users\TH-Nürnberg\Source\Repos\Prog2-SS2018-Wienkop2\Prog2_SS2018\06Ausnahmen\obj\Debug\06Ausnahmen.exe
C:\Users\TH-Nürnberg\Source\Repos\Prog2-SS2018-Wienkop2\Prog2_SS2018\06Ausnahmen\obj\Debug\06Ausnahmen.pdb
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{53ED5B45-614B-464A-BED8-7361A5E2D5F5}</ProjectGuid>
<OutputType>Exe</OutputType>
<RootNamespace>_06Exceptions</RootNamespace>
<AssemblyName>06Exceptions</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
</configuration>
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _06Exceptions
{
class Program
{
class Quadrierfehler : ArgumentOutOfRangeException
{
public Quadrierfehler(string Fehlertext) : base(Fehlertext) { }
}
static int funktion2(int x)
{
if (x < 0)
throw new ArgumentOutOfRangeException("Fehler in funktion2");
return x * x * x;
}
static int funktion(int x)
{
funktion2(x);
if (x < 0)
throw new Quadrierfehler("So nicht!!!");
if (x == 0)
throw new ArgumentOutOfRangeException("Argument darf nicht null sein");
return x * x;
}
static void Main(string[] args)
{
try
{
funktion(-3);
funktion(-2);
}
catch (Quadrierfehler q)
{
Console.WriteLine("Quadrierfehler");
}
catch (ArgumentOutOfRangeException e)
{
Console.WriteLine(e.Message);
Console.WriteLine("--------");
throw; // Weiterwerfen der Exception
}
//catch (Exception e)
//{
// Console.WriteLine("Allgemeiner Fehler");
//}
finally { } // Code wird IMMER durchlaufen!
// Unterschied zwischen
// try
// {
// doSomething();
// }
// catch
// {
// catchSomething();
// }
// finally
// {
// alwaysDoThis();
// }
// und ...
// try
// {
// doSomething();
// }
// catch
// {
// catchSomething();
// throw;
// return;
// }
// alwaysDoThis();
}
static void Main1(string[] args)
{
try
{
try
{
Console.WriteLine("foo");
throw new Exception("exception"); //error occurs here
}
catch (Exception)
{
Console.WriteLine("foo - catch");
throw;
}
finally //will execute this as it is the first exception statement
{
Console.WriteLine("foo's finally called");
}
}
catch (Exception e) // then this
{
Console.WriteLine("Exception caught. Message: " + e.Message);
}
}
}
}
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// Allgemeine Informationen über eine Assembly werden über die folgenden
// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
// die einer Assembly zugeordnet sind.
[assembly: AssemblyTitle("06Exceptions")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("06Exceptions")]
[assembly: AssemblyCopyright("Copyright © 2018")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly
// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von
// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen.
[assembly: ComVisible(false)]
// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
[assembly: Guid("53ed5b45-614b-464a-bed8-7361a5e2d5f5")]
// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
//
// Hauptversion
// Nebenversion
// Buildnummer
// Revision
//
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
// übernehmen, indem Sie "*" eingeben:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
<?xml version="1.0" encoding="utf-8" ?>
<configuration>