Zijn er talen die in een method meerdere interfaces accep...

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • Uhmmie
  • Registratie: Januari 2000
  • Laatst online: 14-06 13:25
Even een voorbeeldje

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
interface iSum {
  public int Sum(int $a, int $b);
}

interface iSubstract {
  public int Substract(int $a, int $b);
}

class Calculator implements iSum, iSubstract
{
  //Implementatie
}

class Abacus implements iSum, iSubstract
{
  //Implementatie
}

class Person 
{
  public void attachTool(iSum&iSubstract $tool)
  { 
     //Implementatie
  }
}



Zijn er talen waarbij ik aan kan geven dat een argument meer dan 1 interface moet ondersteunen? Ik weet dat ik dit opkan lossen door een nieuwe interface iSumSubstract te maken die extend van iSum en iSubstract en waarbij de Calculator en de Abacus dan de iSumSubtract implementeren maar ik vroeg me af of er programmeer talen zijn die het ondersteunen dat je gewoon in een method meerdere interfaces op kan geven die allemaal ondersteund moeten worden door het object die er aan mee gegeven wordt.

Currently playing: MTG Arena (PC)

Beste antwoord (via Uhmmie op 22-01-2021 17:10)


  • Haan
  • Registratie: Februari 2004
  • Laatst online: 18:40

Haan

dotnetter

In C# / .NET kan dit vrij simpel met generics, ik vermoed in andere talen dus ook.
Inspiratieloos voorbeeld:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public interface IFoo
{
    void Foo();
}

public interface IBar
{
    void Bar();
}

public class MyClass
{
    public void DoSomething<T>(T input)
         where T : IFoo, IBar
    {
        input.Foo();
        input.Bar();
    }
}

Kater? Eerst water, de rest komt later

Alle reacties


Acties:
  • Beste antwoord
  • +2 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 18:40

Haan

dotnetter

In C# / .NET kan dit vrij simpel met generics, ik vermoed in andere talen dus ook.
Inspiratieloos voorbeeld:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public interface IFoo
{
    void Foo();
}

public interface IBar
{
    void Bar();
}

public class MyClass
{
    public void DoSomething<T>(T input)
         where T : IFoo, IBar
    {
        input.Foo();
        input.Bar();
    }
}

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Uhmmie
  • Registratie: Januari 2000
  • Laatst online: 14-06 13:25
@Haan Haha dat is nog eens een snelle reactie. Heel erg bedankt! In PHP is dit dus gewoon niet mogelijk (daar zit mijn meeste kennis) en volgens mij is het ook niet in Java mogelijk (hier heb ik maar beperkte kennis van, dus ik hoor het graag als ik mis heb mbt Java).

In eerste instantie wilde ik dus Java verder gaan leren (die overgang lijkt echt super simpel vanaf PHP). Maar het leek me toch wel slim om eerste wat verdere onderzoek te doen naar andere talen.

Vandaar dat ik dus ook een lijstje met zaken aan het maken ben van zaken waar ik dus keer op keer tegen aanloop met PHP om zo een taal te vinden die ik wil gaan leren, zodat ik hopelijk binnenkort (lees: ik weet dat dit optimistisch is) opzoek kan gaan naar een ander werkgever, want ik merk dat ik na 15 jaar PHP het aardig zat begin te worden dat ik steeds allerlei sprongen moet maken, die in andere talen gewoon out of the box mogelijk zijn :).

Currently playing: MTG Arena (PC)


Acties:
  • +1 Henk 'm!

  • gedonie
  • Registratie: Januari 2011
  • Laatst online: 22-02 13:30
In java is dit net zoals in .NET mogelijk via generics.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
interface Sumable {
  public int Sum(int a, int b);
}

interface Substractable {
  public int Substract(int a, int b);
}

public class MyClass {

  public <T extends Sumable & Substractable> void doSomething(T calculus) {
      // your logic
  }
}

Acties:
  • 0 Henk 'm!

  • Uhmmie
  • Registratie: Januari 2000
  • Laatst online: 14-06 13:25
@gedonie Bedankt voor de snelle reactie, zoals ik al aangaf is mijn kennis van Java nog zeer beperkt.. Dus daar zat ik dus mis :).

Currently playing: MTG Arena (PC)


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Haan schreef op vrijdag 22 januari 2021 @ 16:58:
In C# / .NET kan dit vrij simpel met generics, ik vermoed in andere talen dus ook.
Generics heeft er echter weinig mee te maken ;)
https://docs.microsoft.co...-interface-implementation


Edit: Nevermind, ik las de vraag niet goed :X My bad.

Anyway; toch is 't ook handig te weten van explicit interface implementations :P En om TS dan nog even aan een term te helpen: Waar je op doelt noemt men (Generic) Constraints.

[ Voor 44% gewijzigd door RobIII op 22-01-2021 17:31 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Uhmmie
  • Registratie: Januari 2000
  • Laatst online: 14-06 13:25
@RobIII Bedankt voor de info.

Voor nu besloten om eerst ook eens een basis curses C# te volgen. Daarna bepalen of ik me ga focussen op Java of C#. Qua banen lijkt het me niet heel erg veel te verschillen en ik gok dat als ik 1 van de 2 onder de knie heb, ik ook vrij makkelijk naar de andere over kan stappen.

Voordeel wat ik bij C# zie is dat (indien nodig) ik ook een uitstapje kan maken naar F# (die stap vind ik voor nu nog te groot).
Voordeel van Java vind ik dat ik met IntelliJ wel erg dicht bij PhpStorm kan blijven (zelfde maker) en ik de syntax als PHP developer wat sneller herken.. Voor C# lijkt het me toch wel handig om Visual Studio of VS code tegaan gebruiken?
Beide talen lijken iig een aantal voordelen te hebben tegenover PHP (voor nu vooral dus Generics en method overloading, 2 dingen die ik heel erg mis in PHP).

Wat ik nog uit moet gaan zoeken is hoe dependencies geregeld worden in beide talen? Ik moet zeggen dat ik erg fan ben van composer. Maar ik gok dat beide talen hier ook wel een nette oplossing voor hebben?

Currently playing: MTG Arena (PC)


Acties:
  • +1 Henk 'm!

  • mrhoeve
  • Registratie: Augustus 2010
  • Laatst online: 14-04 20:04
Voordeel van Java vind ik dat ik met IntelliJ wel erg dicht bij PhpStorm kan blijven (zelfde maker) en ik de syntax als PHP developer wat sneller herken.. Voor C# lijkt het me toch wel handig om Visual Studio of VS code tegaan gebruiken?
Voor C# kun je ook Rider gebruiken, net als PhpStorm en IntelliJ van JetBrains. Ik heb daar zeer goede ervaringen mee. Grootste nadeel is dat je volgens mij nog steeds geen formulieren kan maken met de eenvoud die VS wel biedt.

Verder lijken C# en Java in veel opzichten op elk elkaar. Ik programmeer normaal gesproken in Java op mijn werk, maar thuis werk ik aan mijn eigen projecten in C#. Natuurlijk zitten er de nodige verschillen in, maar de stap is niet heel groot voor mijn gevoel.

Acties:
  • 0 Henk 'm!

  • Uhmmie
  • Registratie: Januari 2000
  • Laatst online: 14-06 13:25
mrhoeve schreef op vrijdag 22 januari 2021 @ 19:17:
[...]


Voor C# kun je ook Rider gebruiken, net als PhpStorm en IntelliJ van JetBrains. Ik heb daar zeer goede ervaringen mee. Grootste nadeel is dat je volgens mij nog steeds geen formulieren kan maken met de eenvoud die VS wel biedt.

Verder lijken C# en Java in veel opzichten op elk elkaar. Ik programmeer normaal gesproken in Java op mijn werk, maar thuis werk ik aan mijn eigen projecten in C#. Natuurlijk zitten er de nodige verschillen in, maar de stap is niet heel groot voor mijn gevoel.
Dat hoopte ik idd al, voor nu dus gewoon even kijken welke me het beste ligt. Ik heb afgelopen weekend een basis cursus Java afgerond en ben net begonnen met een C# cursus (maar ik denk dat ik even verder ga zoeken, want de kwaliteit van de course lijkt me niet zo heel goed)..

Ps. Mocht iemand nog tips hebben voor echt goede online cursus C# (mag betaald zijn). Dan hoor ik dat graag. Ik heb ondertussen al 3 verschillende geprobeerd op Udemy.. Maar vervolgens zitten ze zo slecht in elkaar dat ik snel weer afgehaakt ben.. Waarschijnlijk had ik met mijn java cursus meer geluk, want die zat daar wel echt goed in elkaar.

[ Voor 16% gewijzigd door Uhmmie op 22-01-2021 21:58 ]

Currently playing: MTG Arena (PC)


Acties:
  • 0 Henk 'm!

  • Uhmmie
  • Registratie: Januari 2000
  • Laatst online: 14-06 13:25
@Haan @mrhoeve @RobIII
Ik zit even een beetje te rommelen met unit testing. En nu valt het me op dat ik met de standaard tooling (maar ook met google kan ik geen oplossing vinden) geen class direct kan mocken. De enige oplossing die ik kan vinden is Fakes van MS, maar daar voor moet je de enterprise versie van Visual Studio hebben. Is er echt geen andere mogelijkheid om classes te mocken? (Anders dan dat ik voor iedere class een interface aan moet maken? Want dat is nu net wat ik wil voorkomen voor een aantal simpele classes).

Currently playing: MTG Arena (PC)


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Er zijn talloze Mocking libraries. Moq en Rhinomocks zijn twee veelgebruikte voorbeelden daarvan.

[ Voor 54% gewijzigd door RobIII op 26-01-2021 20:59 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Uhmmie
  • Registratie: Januari 2000
  • Laatst online: 14-06 13:25
RobIII schreef op dinsdag 26 januari 2021 @ 20:57:
Er zijn talloze Mocking libraries. Moq en Rhinomock zijn twee veelgebruikte voorbeelden daarvan.
Moq had ik idd ook gevonden, maar daarmee kan je toch geen classes mocken? Ik lees iig overal dat dat alleen werkt om Mock implementaties van interfaces te maken? Of klopt dat niet? Ik zal even kijken of ik in die lijst wel een oplossing kan vinden waarmee je ook classes zelf kan mocken.

Currently playing: MTG Arena (PC)


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
https://stackoverflow.com/a/20400769/215042
https://stackoverflow.com/a/43097762/215042

Zomaar wat random hits (de eerste twee to be exact) als ik zoek op "Moq class c#"

[ Voor 15% gewijzigd door RobIII op 26-01-2021 21:02 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Uhmmie
  • Registratie: Januari 2000
  • Laatst online: 14-06 13:25
Maar die twee hits geven precies het probleem aan, namelijk dat je met Moq alleen interfaces en virtual methods kan mocken. Ik had die inderdaad zelf al gevonden en vandaar dus ook mijn eerste vraag, weet iemand een oplossing in C# waarmee je classes zelf (met gewone methods) kan mocken :).

Het enige wat ik tot nu toe gevonden heb is Fakes van MS, maar zoals al aangegeven is die alleen voor Microsoft Visual Studio Enterprise helaas :(.

[ Voor 11% gewijzigd door Uhmmie op 26-01-2021 21:07 ]

Currently playing: MTG Arena (PC)


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Uhmmie schreef op dinsdag 26 januari 2021 @ 21:06:
weet iemand een oplossing in C# waarmee je classes zelf (met gewone methods) kan mocken :).
Dat zei je er eerst niet bij ;)
Maar ik heb 't gevoel dat je een beetje... in de PHP blijft hangen ofzo. Ik 'bouw' mijn mocks/fakes altijd handmatig dus ik ben niet super bekend met die frameworks, maar zie 't nut ook niet zo van wat je nu wil. Je hebt hier nog een alternatief ("optie B") maar het is vrij ongebruikelijk volgens mij wat je nu wil. Waarom wil je niet met een interface werken?

[ Voor 23% gewijzigd door RobIII op 26-01-2021 21:13 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Uhmmie
  • Registratie: Januari 2000
  • Laatst online: 14-06 13:25
RobIII schreef op dinsdag 26 januari 2021 @ 21:08:
[...]

Dat zei je er eerst niet bij ;)
Maar ik heb 't gevoel dat je een beetje... in de PHP blijft hangen ofzo. Ik 'bouw' mijn mocks/fakes altijd handmatig maar zie 't nut niet zo van wat je nu wil.
Dat bedoelde ik met "class direct kan mocken", maar dat was misschien niet duidelijk. En ja het kan best zijn dat het in C# mogelijk anders moet.

Ondertussen wel Typemock gevonden, maar dat is helaas ook een betaalde oplossing. Aangezien ik C# nog aan het leren ben, wil ik liever nog geen geld uitgeven aan tooling die ik misschien over een week al niet meer gebruik :+.

Maar hoe bouw jij je mocks dan zelf? Dan moet dat haast ook wel op basis van een interface zijn?

Currently playing: MTG Arena (PC)


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Uhmmie schreef op dinsdag 26 januari 2021 @ 21:13:
Dan moet dat haast ook wel op basis van een interface zijn?
Dat hangt een beetje van de situatie af, maar in 8 of 9 van de 10 gevallen inderdaad op basis van de interface ja.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Uhmmie
  • Registratie: Januari 2000
  • Laatst online: 14-06 13:25
RobIII schreef op dinsdag 26 januari 2021 @ 21:14:
[...]

Dat hangt een beetje van de situatie af, maar in 8 of 9 van de 10 gevallen inderdaad op basis van de interface ja.
Ok dan ga ik voor nu toch maar interfaces defineren.

Currently playing: MTG Arena (PC)


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Uhmmie schreef op dinsdag 26 januari 2021 @ 21:22:
[...]

Ok dan ga ik voor nu toch maar interfaces defineren.
Dat is sowieso een goed idee (in elke taal overigens, dus ook Java en PHP). Leer SOLID werken ;)

[ Voor 15% gewijzigd door RobIII op 26-01-2021 21:29 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Uhmmie
  • Registratie: Januari 2000
  • Laatst online: 14-06 13:25
RobIII schreef op dinsdag 26 januari 2021 @ 21:23:
[...]

Dat is sowieso een goed idee (in elke taal overigens). Leer SOLID werken ;)
Ik weet wat solid is ;).

Maar stel je hebt iets als:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
interface ISomeInterface {
}

class A implements ISomeInterface {
}

class B implements ISomeInterface {
}

class SuperDuper {
  public int doSomething(A $a);
  public int doSomething(B $b);
}


Omdat je met A iets anders wil doen dan met B. (Ik weet het ik zou die logica weer op zou kunnen nemen in A en B vanwege de O in solid ;), maar in sommige gevallen wil je misschien geen andere implemenaties van de interface accepteren)..

Vervolgens wil ik SuperDuper testen, ik wil dat niet met de echte implementaties A en B doen. Maar met mocks van A en B. En dat is nu niet mogelijk? Of zie ik iets van C# over het hoofd?

[ Voor 6% gewijzigd door Uhmmie op 26-01-2021 21:36 ]

Currently playing: MTG Arena (PC)


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Uhmmie schreef op dinsdag 26 januari 2021 @ 21:34:
Vervolgens wil ik SuperDuper testen, ik wil dat niet met de echte implementaties A en B doen. Maar met mocks van A en B. En dat is nu niet mogelijk? Of zie ik iets van C# over het hoofd?
Je zou kunnen inheriten van A en/of B maar ik vind 't sowieso een rare (hypothetische? geforceerde?) situatie. Heb je een praktijkvoorbeeld?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Uhmmie
  • Registratie: Januari 2000
  • Laatst online: 14-06 13:25
RobIII schreef op dinsdag 26 januari 2021 @ 21:38:
[...]

Je zou kunnen inheriten van A en/of B maar ik vind 't sowieso een rare (geforceerde?) situatie. Heb je een praktijkvoorbeeld?
Omg lol zo simpel, maar dat is wel precies waarmee ik mijn probleempje op kan lossen (nouja niet helemaal want nu kan ik geen final meer gebruiken, maar goed genoeg voor nu). Maar ik wil dit vooral nog wel eens toepassen als ik eigenlijk echt niet wil dat iemand zijn eigen implentatie kan maken.. Ik probeer even een simpel voorbeeldje te maken..

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
interface IDoor{}

interface ILock{
}

class SafeLock implements ILock {
 //implentation only acccepts a cetain key.
}

class SafeDoor implements IDoor {
  SafeDoor(SafeLock $lock) {}
}

class NonSafeDoor implements IDoor {
  NonSafeDoor(ILock $lock) {}
}

Now someone can create the class:

class NoLock implements ILock {
//Does something that requires no key.
}


Ik snap dat het maken van een NoLock de verantwoordelijkheid is van de developer.. Maar zoals ik al zeg probeer ik dat soms (meestal niet) te voorkomen.

[ Voor 10% gewijzigd door Uhmmie op 26-01-2021 21:55 ]

Currently playing: MTG Arena (PC)


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Uhmmie schreef op dinsdag 26 januari 2021 @ 21:53:
nouja niet helemaal want nu kan ik geen final meer gebruiken
Dat kun je toch al niet in C#. Wel sealed ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Uhmmie
  • Registratie: Januari 2000
  • Laatst online: 14-06 13:25
RobIII schreef op dinsdag 26 januari 2021 @ 21:55:
[...]

Dat kun je toch al niet in C#. Wel sealed ;)
Ja ik ben bij C# echt nog een beginner (helaas :P).

Currently playing: MTG Arena (PC)


Acties:
  • 0 Henk 'm!

  • RagingPenguin
  • Registratie: December 2012
  • Niet online
Uhmmie schreef op vrijdag 22 januari 2021 @ 16:54:
Even een voorbeeldje

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
interface iSum {
  public int Sum(int $a, int $b);
}

interface iSubstract {
  public int Substract(int $a, int $b);
}

class Calculator implements iSum, iSubstract
{
  //Implementatie
}

class Abacus implements iSum, iSubstract
{
  //Implementatie
}

class Person 
{
  public void attachTool(iSum&iSubstract $tool)
  { 
     //Implementatie
  }
}



Zijn er talen waarbij ik aan kan geven dat een argument meer dan 1 interface moet ondersteunen? Ik weet dat ik dit opkan lossen door een nieuwe interface iSumSubstract te maken die extend van iSum en iSubstract en waarbij de Calculator en de Abacus dan de iSumSubtract implementeren maar ik vroeg me af of er programmeer talen zijn die het ondersteunen dat je gewoon in een method meerdere interfaces op kan geven die allemaal ondersteund moeten worden door het object die er aan mee gegeven wordt.
Er zijn ook talen die dit kunnen zonder een generic te gebruiken, bv, TypeScript:

TypeScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
interface IFoo
{
    Foo(): void
}

interface IBar
{
    Bar(): void
}

class MyClass
{
    public DoSomething(input: IBar & IFoo): void
    {
        input.Foo();
        input.Bar();
    }
}

Acties:
  • 0 Henk 'm!

  • Uhmmie
  • Registratie: Januari 2000
  • Laatst online: 14-06 13:25
@RagingPenguin Bedankt voor de input :). Een tijdje terug wel gekeken naar TS voor front-end werk, maar verder eigenlijk niet echt in verdiep. Ik zal er eens wat tijd aanbesteden.

Currently playing: MTG Arena (PC)

Pagina: 1