Coders Chit-Chat

07/29/2015 17:24 Serraniel#106
Bei einer abstrakten Klasse hast du die Möglichkeit eine Defaultimplementierung anzubieten. Bei einem Interface sagst du wirklich nur du hast Methode XY mit den Parameter abc von den Typen kij und dem Rückgabe wert v. Zudem kann man bei einem Interface auch keine Attribute angeben, wenn ich mich jetzt nicht Irre.

Weiterer Unterschied ist, dass Klassen nachher mehrere Interfaces implementieren können, aber immer von maximal einer (abstrakten) Klasse erben können.
07/29/2015 17:40 Logtetsch#107
Das man eine default-Implementierung vornehmen kann, war mir nicht bewusst, aber wäre es dann nicht sinnvoller einfach eine normale Klasse zunehmen, und die Methoden einfach virtuell zu kennzeichnen?

Was würde bei folgendem Szenario passieren? Wie sähe hier die Implementierung aus? Soviel ich weiß, ist eine Methoden-Überladung nur durch unterschiedliche Signaturen, welche den Rückgabetyp nicht berücksichtigt, gültig. Würde es hierbei zu einem Konflikt kommen und ich müsste auf ein Interface (ITest1 / ITest2) verzichten?
Code:
interface ITest1
{
     int foo(int a, int b);
}

interface ITest2
{
     void foo(int a, int b)
}

public sealed class CFoo : ITest1, ITest2
{
      //........
}
Achja, bevor ich es vergesse: Sind alle Methoden, Eigenschaften und Felder automatisch statisch, wenn ich die Klasse mit dem static Modifizierer bestücke?
07/29/2015 18:10 Serraniel#108
Kannst glaube ich eine für beide Implementieren, oder für beide einzeln, indem du den Interfacenamen davor schreibst, da bin ich mir gerade nicht ganz sicher, sollte aber gehen.
Bei einer abstrakten Klassen kannst du auch kein Objekt direkt erzeugen, sondern nur von erbenden Klassen.
07/30/2015 10:20 Devsome#109
Glaube das das einige noch nicht wussten :>
[Only registered and activated users can see links. Click Here To Register...]
07/30/2015 11:06 Serraniel#110
Danke, find ich gut zu wissen, hat mir zwar noch nie bewusst Probleme gemacht aber damit hat man diverse Optimierungsmöglichkeiten, wenn man das weiß.
07/30/2015 12:29 Padrio#111
Wenn wir schon beim Optimieren sind:

PHP Code:
if(isset($string[100])){ echo '$string ist zu lang'; } 
ist schneller als:

PHP Code:
if(strlen($string) > 100){ echo '$string ist zu lang';  } 
So was ist immer ganz interessant zu wissen :p
07/30/2015 13:07 Devsome#112
Quote:
Originally Posted by Macina View Post
Wenn wir schon beim Optimieren sind:

PHP Code:
if(isset($string[100])){ echo '$string ist zu lang'; } 
ist schneller als:

PHP Code:
if(strlen($string) > 100){ echo '$string ist zu lang';  } 
So was ist immer ganz interessant zu wissen :p
Ich weiß momentan nicht welche von den abfragen in dem Fall schneller wäre.

PHP Code:
$string "normaler string";

if(
strlen($string) > 10){ echo $string .' =>ist zu lang [1]<br/>';  }  

echo (
strlen($string) > 10) ? $string .' =>ist zu lang [2]<br/>' ''
07/30/2015 13:36 Padrio#113
Quote:
Originally Posted by Devsome View Post
Ich weiß momentan nicht welche von den abfragen in dem Fall schneller wäre.

PHP Code:
$string "normaler string";

if(
strlen($string) > 10){ echo $string .' =>ist zu lang [1]<br/>';  }  

echo (
strlen($string) > 10) ? $string .' =>ist zu lang [2]<br/>' ''
Ich meine im Sinn zu haben das die inline ifs weniger performant sind.
Vorallem ist eine normale if lesbarer als die inline dinger.
07/30/2015 14:23 algernong#114
Quote:
Originally Posted by Macina View Post
Wenn wir schon beim Optimieren sind:

PHP Code:
if(isset($string[100])){ echo '$string ist zu lang'; } 
ist schneller als:

PHP Code:
if(strlen($string) > 100){ echo '$string ist zu lang';  } 
So was ist immer ganz interessant zu wissen :p
Ist die zweite Variante wegen der Lesbarkeit nicht trotzdem deutlich besser?
07/30/2015 14:27 Padrio#115
Quote:
Originally Posted by algernong View Post
Ist die zweite Variante wegen der Lesbarkeit nicht trotzdem deutlich besser?
Das stimmt, aber mit einem kleinem Kommentar (falls die meisten Programmierer so was überhaupt machen o,o) löst sich das ganze ja von selbst.
07/30/2015 14:48 MrSm!th#116
Das ist premature optimization. Nimm das was lesbarer ist.
Quote:
Originally Posted by Logtetsch View Post
Das man eine default-Implementierung vornehmen kann, war mir nicht bewusst, aber wäre es dann nicht sinnvoller einfach eine normale Klasse zunehmen, und die Methoden einfach virtuell zu kennzeichnen?

Was würde bei folgendem Szenario passieren? Wie sähe hier die Implementierung aus? Soviel ich weiß, ist eine Methoden-Überladung nur durch unterschiedliche Signaturen, welche den Rückgabetyp nicht berücksichtigt, gültig. Würde es hierbei zu einem Konflikt kommen und ich müsste auf ein Interface (ITest1 / ITest2) verzichten?
Code:
interface ITest1
{
     int foo(int a, int b);
}

interface ITest2
{
     void foo(int a, int b)
}

public sealed class CFoo : ITest1, ITest2
{
      //........
}
Achja, bevor ich es vergesse: Sind alle Methoden, Eigenschaften und Felder automatisch statisch, wenn ich die Klasse mit dem static Modifizierer bestücke?
Wenn mehrere Interfaces die gleichen Methoden haben, ist das kein Problem. Es ist letztendlich nur ein Vertrag, der besagt, dass diese Methode vorhanden sein muss (Interfaces zu implementieren ist nicht dasselbe wie von einer abstrakten Klasse zu erben!). Wenn zwei Verträge die Methode fordern, erfüllst du trotzdem beide, auch wenn du die Methode nur einmal hast.
Bei Mehrfachvererbung wäre das nicht so einfach, aber die unterstützt C# ja nicht.

Wenn es übrigens keinen Grund für eine abstrakte Klasse oder überhaupt Vererbung gibt, ist ein Interface vorzuziehen. Kompositionen sind flexibler als Vererbung.
sealed solltest du übrigens ebenfalls nur verwenden, wenn du auch einen guten Grund dazu hast.

Nein,statische Klassen machen nicht automatisch alles statisch. Du musst die Sachen selbst als statisch deklarieren.

p.s. [Only registered and activated users can see links. Click Here To Register...]
Optimal, wenn du dir solche Fragen stellst wie "Was ist wenn". Probieren geht über Studieren.
07/30/2015 15:12 Devsome#117
07/31/2015 09:24 XxharCs#118
Quote:
Originally Posted by Devsome View Post
Ich trage ne Brille, aber ich kann C# :bandit::D:mofo::cool:
Der Witz ist aber schon älter hehe^^

Edit:
08/01/2015 12:56 Moneypulation#119
Würde mich gerne für mein Informatikstudium vorbereiten. WS fängt erst in 2 Monaten an. Was würdet ihr vorschlagen? Programmiergrundkenntnisse kenne ich natürlich schon. Java und C# kann ich teilweise. Sollte ich eine der beiden, ich sag mal auf einem profi level können?
08/01/2015 13:11 warfley#120
Quote:
Originally Posted by Moneypulation View Post
Würde mich gerne für mein Informatikstudium vorbereiten. WS fängt erst in 2 Monaten an. Was würdet ihr vorschlagen? Programmiergrundkenntnisse kenne ich natürlich schon. Java und C# kann ich teilweise. Sollte ich eine der beiden, ich sag mal auf einem profi level können?
Im Studium gibt es genug Leute die selbst nicht oder kaum programmieren können (bei mir waren es etwa 1/3 aller Info Studenten) Programmieren zu können ist hilfreich, aber auf "profi level" musst du es auf keinen Fall können. Und letztlich so viel Programmieren kommt auch nicht dran, eigentlich musst du nur Pseudocode lesen können (außer in modulen wie Programmierung etc). Ich würde eher wenn die Uni so etwas anbietet eine Mathe Vorkurs besuchen, und generell deine Mathekentnisse aufbereiten.