(VB.net Express Beta) Math innehåller väl bara statiska metoder. jag skulle nog göra något i stil med: System.Reflection.MethodInfo kan inte användas direkt, eftersom den klassen är deklarerad MustInherit och därmed kan inte instansen methodInfo skapas (med New) vilket kompilatorn förstås kräver. Jag fattar inte riktigt vad du pratar om i första stycket, funkade inte exempel koden? Nej Johan, din exempelkod funkade inte för mig. Den blev hindrad på ett tidigt stadium. Det kanske är petigare i .net 2.0 , vad vet jag. Det är möjligt att det är något jag missförstår, men jag provade att lägga in det likadant som du skrivit det. Kompilatorn krävde ett new, som i sin tur syntaxkollen inte accepterade. Men det är förstås VB.net 2.0 BETA som jag använder (det är den enda version som man kan prova utan att tömma plånboken), så det kan tänkas att det är något med det som inte är klart ännu. Vad jag förstått är programmeringsmiljön utvecklad en hel del sen version 1. Gör en egen klass. Tack för goda råd Micke! Jag brukar nog arbeta på det sättet, men det kan inte hjälpas att Smalltalk har en bättre bygglåda. Och vad jag håller på med är att lära mig vilka vägar som funkar bäst i .net. Såklart att jag undersöker de som jag är van vid först. När det är för krångligt tittar jag på andra lösningar. Den som ligger närmast till är just en ny klass, som kan hantera CallByName för alla de funktioner jag behöver. Det går ju alltid att göra. VB7 är mappnamnet som VB.Net installeras i... Kan ingenting om vb.net 2.0 men jag kan väl säga så här vad är syftet med dina nya insikter? (Svar till Micke: ) Beta, då är det VB8 ja :) Detta får jag att fungera iallafall. Jag håller med om att det är lite töntigt att man inte kan ärva MathSystem.Math
Jag försöker andvända följande uttryck:
CallByName(Math, functionName, CallType.Method, myValue)
Men då säger VB att Math är en typ och kan inte användas som en expession.
OK, då försöker jag använda en instans av Math . Men nej, <new Math> går inte för sig.
Nåväl, en subklass till Math då. Nej!! Math kan inte ha nån subklass.
Hur skall jag bära mig åt? Eller är det helt omöjligt att använda CallByName med Math?
VB6 var nerklottrat med undantag. Det verkar bättre i VB.net men en del återstår...
Skulle det här gå bättre att göra i C#?
- Hans Sv: System.Math
Så här kan man väl göra annars i "vanliga" vb.net :
Dim myType As Type = GetType(Math)
Dim methodInfo As MethodInfo = myType.GetMethod("functionName")
methodInfo.Invoke(Nothing, New Object() {myValue})
Sv: System.Math
c# exempel
public delegate double MyMathDelegate(double value);
.........
hashtable ht=new hashtable()
ht["cos"]=new MyMathDelegate(Math.Cos);
ht["sin"]=new MyMathDelegate(Math.Sin);
ht["tan"]=new MyMathDelegate(Math.Tan);
ht["apa"]=new MyMathDelegate(myclass.myownmathmethod);
.........
MyMathDelegate method=(MyMathDelegate)ht[strFuncName];
double res=method(myvalue);
då kan du med lätthet lägga till nya metoder som inte ligger i system.math
//Roger
Sv: System.Math
Här har jag att välja på att sätta mig bättre in i de djupare finesserna i VB.net eller helt enkelt låta fingrarna gör jobbet och skriva en lista enl Rogers förslag (eller en case-sats). I det senare fallet vinner jag också den fördelen att jag kan ta hand om alla operationer på ett ställe ,å so m Roger skriver.
(Jag är van från Smalltalk där allt sånt här är enkelt och konsekvent.)
- HansSv: System.Math
Visst kan det vara bättre att göra som Roggan föreslår om man vill ha mer kontroll. Allt hänger ju på vad man vill uppnå och i vilket syfte. Om du beskriver vad du egentligen vill göra kanske någon kan komma med en riktigt bra lösning...Sv: System.Math
Vad jag vill åstadkomma är egentligen bara att lära mig VB.net. Som övningsexempel har jag tagit en liten rpn-kalkylator som jag nyligen gjort i Smalltalk MT. Jag vill se hur jag kan göra på lämpligt sätt med utgångspunkt från det.
Indata sker i ett minimalt fönster, huvudsakligen från tangentbordet, men även från en liten knappsats som fälls ut vid behov.
Jag försöker minimera gränssnittet mellan model och view, så att view sänder innehållet i textrutan tillsammans med en sträng med namnet på den funktion/operation som användaren valt. Modellen har rpn-stacken och gör beräkningarna, skickar sedan tillbaka resultatet att visas i textrutan.
Det är för att utföra den önskade beräkningen som jag först försökte men CallByName och Math, egentligen för att se hur det funkar i VB.net. I Smalltalk är detta en enkel och uppenbar sak - jag ser till att operator-strängarna ser ut som motsvarande metodväljare. Då behöver jag bara skicka #perform: <op-sträng> asSymbol (med tillägget with: andraTalet om det är en binär metod) till talet som skall beräknas. Objekt av klassen Float kan alla de metoder jag behöver, och vill jag ha fler är det bara att komplettera. Kraftfullt, enkelt och självklart.
Jag ville alltså se om det finns något motsvarande sätt att göra det i VB.net. Men det ser inte så ut. Det finns ingen klass som klarar alla slags matematiska beräkningar, så jag måste i vilket fall dela upp det hela på olika grupper av funktioner. Därför ser det ut som lärdomen är att man får använda ett mindre "elegant" sätt att göra denna delen av programmet.
VB.net är utmärkt bra för att göra fönster och knappar, men för innanmätet är Smalltalk mycket enklare och kraftfullare. Tyvärr är jag av andra skäl tvungen att lära mig något visualstudio.net-språk och eftersom jag har viss tidigare erfarenhet från VB6 så har jag valt VB.net
- Hans Sv: System.Math
Det är det som är fördelen med .NET. Finns det inte, gör det själv...
Men innan man börjar skall man fundera på detta: Varför går det inte att göra som jag vill? Är det för att jag vill göra som jag alltid gjort (i ett annat språk/annan miljö) eller är det jag vill göra inte så smart eller bara onödigt krångligt.
.NET är enkelt (inte komplicerat om man vet vad man vill göra).
.NET är INTE VB7, C++ 12.0 eller någon annan påbyggnad på ett språk. Du har alltså ingen nytta av dina gamla Smalltalk-så-här-gör-man kunskaper (och inte från VB heller för den delen)
.NET är en NY miljö! Det enda du kan slippa lära dig är syntaxen (på loopar och sånt)
/mickeSv: System.Math
Men det är dålig återanvändning. Allt jag gör i den nya klass finns ju redan, bara det att det är organiserat så att det inte går att komma åt på ett enkelt sätt.
Jag är klar över att .net är något nytt jämfört med VB6, men det mesta (som jag ser det) är att man närmat sig Smalltalk en bit, så för mig är de nyheterna inte så märkvärdiga. (Jag är medveten om att .net har en massa funktionalitet för att hantera en massa saker som jag inte vet ett dugg om, och förmodligen aldrig kommer att behöva använda)
> .NET är enkelt (inte komplicerat om man vet vad man vill göra).
Jo, nog är det enklare än VB6. Men man måste lära sig först. Det är det jag håller på med. Och mitt sätt att lära mig är att göra något jag vill göra. När jag lärde mig Smalltalk 1987 gjorde jag så. Då hade jag ingen att fråga. Men det gick bra. Nu använder jag möjligheten att fråga.
(F. ö kallas den här versionen för VB8 såg jag någonstans)
- HansSv: System.Math
Kan du göra en funktion som ser ut som:
<code>
Function Calculate(Tal1 as Integer, Tal2 as Integer, Op as string) as Integer
Select Case Op
Case "+"
Return Tal1 + Tal2
Case "-"
Return Tal1 - Tal2
Case "*"
'Same same
Case "/"
'Same same
Case "¤"
'Eller lägg in allt i en funktion till
Return NåtSvårt(Tal1 , Tal2)
End Select
End Function
Function NåtSvårt(T1 as Integer, T2 as Integer) as Integer
'Anropas vid ¤
Return 77 * T1 + T2 /45
'Eller nåt...
End Function
</code>
Anropa den sedan med
Resultat = Calculate(54, 65, "+")
(Du delar upp en sträng i fler m.h.a. Split)
/mickeSv: System.Math
Är syftet att lära dig .net plattformen eller bara kunna skriva samma kod som du skrev i SmallTalk?
Om syftet är att lära dig .net plattformen kanske C# är ett bättre språk att börja med eftersom du då är fri från dina kunskaper i vb6. Jag vet att många företag som migrerar från vb 6 väljer just C# istället för vb.net för att slippa att folk tänker i samma banor som innan. Istället för att traggla på i samma spår lär sig folk att utnyttja frameworket.
Sen om du tycker att vs.net är för dyrt kanske http://www.sharpdevelop.com/ är en bättre plattform för test. Det är ett open source IDE och man får vad man betalar för, men bättre än inget.
Sen eftersom du kommer från SmallTalk så är kanske S# nånting att titta på? http://www.vsippartners.com/PartnerProductDetails.aspx?ProdID=187Sv: System.Math
Efterom det är den kommande versionen jag använder heter mappen "VisualStudio 8"
Jag är fullständigt klar över den version du föreslår, men föredrar av skumma skäl att göra varje funktion separat. Arbetet att skriva blir inte mer. Jag gör en klass som ersätter den Math subklass som inte går att göra plus utökad funktionalitet. Det är inget svårt. Jag ville bara först undersöka om det fanns fiffigare sätt.
(Svar till Johan: )
Avsikten är denna: Jag vill kvalificera mig att kunna delta i ett större projekt skrivet i .net. Det finns personer (eller person) i ledande ställning som hittills inte velat att jag skall delta. Man jag har mycket erfarehet från det gamla program som skall ersättas. (I det tidigare programmet har jag delvis använt VB6, men huvudsakligen http://www.tech.oru.se/cad/varkon/ men för flera år sedan gjorde jag en version i Smalltalk) Min roll skulle kunna vara att fixa resultatutskrifter och kanske typ indatawizards.
Att använda något annat än ett visualstudio .net - verktyg vore alltför kontroversiellt, det skulle minska mina chanser drastiskt.
Annars finns en del Smalltalk för .net på gång (t ex S#, som dock inte är färdigt än det heller) .
Det är nog ingen risk att jag tragglar på i VB6-stil, eftersom jag har grundmurad känsla för ren objektorienterad programmering, och aldrig känt mig hemma i VB6. Men visst kanske det kan vara någon poäng med C# istället.
(Det skrivs Smalltalk, versal endast i början, trots att språket annars är fullt med "kamelryggsord")
- Hans Sv: System.Math
Att göra varje operation som en separat funktion är väl det bästa, men frågan är hur du skall särskilja dem.
Du kan överlagra funktioner med samma namn, men då måste de ha olika signatur. Du får då plocka ut en signatur(parameterlista) för varje funktion - inte så smart i ditt fall, då du har två tal och en grej (oftast kanske).
Sen kan du skriva en ny funktion för varje operation - smart, men du måste fortfarande särskilja och anropa rätt funktion. Denna gång på namnet...
Därav mitt förslag: Du har fler funktioner (sista Case visar hur) och du har en huvudfunktion som väljer, anropar och tar hand om resultatet. Sedan om din Case kommer i en separat funktion, i en Button_Click eller i något annat spelar nog ingen större roll.
/mickeSv: System.Math
Imports System
Imports System.Reflection
Module Main
Sub Main()
Console.WriteLine(Math.Log(10).ToString())
Invoke("Log",10)
End Sub
Sub Invoke(name As String, a as Double)
Dim myType As Type = GetType(Math)
Dim methodInfo As MethodInfo = myType.GetMethod(name,New Type(){GetType(Double)})
Console.WriteLine(methodInfo.Invoke(Nothing, New Object() {a}))
End Sub
Sub Invoke(name As String, a as Double, b as Double)
Dim myType As Type = GetType(Math)
Dim methodInfo As MethodInfo = myType.GetMethod(name,New Type(){GetType(Double)})
Console.WriteLine(methodInfo.Invoke(Nothing, New Object() {a,b}))
End Sub
End Module
Nån gång har jag lovat mig själv att jag skall plocka upp mina Smalltalk kunskaper igen bara för att få en känsla för språket igen (läste 10 p på universitetet men allt är tyvärr bortglömt). Det som jag älskar med Smalltalk är att man kan ha parametrarna mitt inne i metodnamnen. Man kan verkligen få till metodnamn som beskriver sig själv. Om jag inte missminner mig heter väl metoden för att stoppa in nåt i en Dictionary At: aKey Put:anObject och det är ju betydligt mer självförklarande än Add(key, object)...