Mi riferivo al Voronoi.
Hai provato a scrivere qualcosa?
La creazione di una Bezier da una serie limitata di punti e ho provato ad implementare il Voronoi ma ho qualche difficoltà con le interfacce e mi sono fermato per studiarle.
Le interfacce le devi pensare come ad un “modello” comune a più classi. Riporto di seguito
un esempio che potrebbe aiutarti.
Immagina che più classi condividano delle proprietà e dei metodi. Tali proprietà e metodi pur
condividendo lo stesso nome sono specifiche di ogni classe. Per capirsi: se ad esempio
le classi A e B includono il metodo Disegna, per il compilatore sono due metodi distinti.
Le interfacce servono proprio indicare al compilatore che il metodo Disegna della classe A
è “equivalente” al metodo Disegna della classe B. Dov’è il vantaggio?
using System;
using System.Collections.Generic;
class HelloLuca {
class A
{
public void Disegna(){
Console.WriteLine("Sono la classe A");
}
}
class B
{
public void Disegna(){
Console.WriteLine("Sono la classe B");
}
}
static void Main()
{
A a1 = new A();
a1.Disegna();
B b1= new B();
b1.Disegna();
}
}
Se gli oggetti (variabili) aumentano in numero considerevole è ragionevole utilizzare una lista …
using System;
using System.Collections.Generic;
class HelloLuca {
class A
{
public void Disegna(){
Console.WriteLine("Sono la classe A");
}
}
class B
{
public void Disegna(){
Console.WriteLine("Sono la classe B");
}
}
static void Main() {
List<object> myList = new List<object>();
myList.Add(new A());
myList.Add(new B());
for (int i=0;i<myList.Count;i++) {
if (myList[i] is A){
A t = myList[i] as A;
t.Disegna();
continue;
}
if (myList[i] is B){
B t = myList[i] as B;
t.Disegna();
}
}
}
}
Memorizzando tutti gli oggetti in un unica lista astratta (object)
è necessario fare il cast perché object non include il metodo Disegna.
A questo punto si può ipotizzare di usare più liste per tipo (classe) di
oggetti. Nell’ottica di un’applicazione ben più strutturata e complessa
tale scelta non sarebbe “brillante”. Interface semplifica tutto …
using System;
using System.Collections.Generic;
class HelloLuca {
interface IDis
{
void Disegna();
}
class A: IDis
{
public void Disegna(){
Console.WriteLine("Sono la classe A");
}
}
class B: IDis
{
public void Disegna(){
Console.WriteLine("Sono la classe B");
}
}
static void Main() {
List<IDis> myList = new List<IDis>();
myList.Add(new A());
myList.Add(new B());
for (int i=0;i<myList.Count;i++) {
myList[i].Disegna();
};
}
}
I vantaggi sono molteplici ed evidenti.
E bravo Sergio, allora te li mangi anche tu 4 fili…
Complimenti. Ma per cosa usi C#?
Interessante spiegazione. Vedrò nuovamente nel fine settimana ma dovrei già esserci.
Ciao Luca
spero ti sia utile … non ho mai programmato in C#.
Ho letto e fatto qualcosina in C++: il passaggio a C#
è semplice. Anni fa avevo letto i vari Thinking in C++.
Ciao Sergio, è possibile creare una lista di sole interfacce non implementate?
Pensavo si potesse fare la lista di oggetti definiti, come le Classi.
Se intendi definire una interface ma non applicata alle classi dell’applicazione
penso di si. Al più il compilatore ti dirà che l’interface non è utilizzata.
Le classi non sono oggetti ma sono dei modelli di oggetti. Le Interface
individuano proprietà e metodi che ritieni siano utili per classi a lei derivate.
Le interface sono classi perché hanno metodi e proprietà … diciamo
delle classi “scroccone” : in quanto sfruttano il codice delle
classi derivate.
Chiaro, con oggetto classe non intendevo oggetto in senso stretto, ma come concetto, struttura definita e istanziabile.
Per questo ti chiedevo, perché se non sono implementate da classi come possiamo farne una lista? Questo è quello che pensavo, ma evidentemente se pò
Da una rapida prova:
puoi definire una lista (vuota)
e volendo puoi aggiungerci dei null
Quindi dici a maggior ragione puoi inserire interfacce. Ottimo grazie.
@0904 ci sei?
Se non ricordo male, non possiamo costruire istanze di interfacce ma solo di classi che implementano l’interfaccia.
Credo che senza oggetti che implementano l’interfaccia l’unica cosa che possiamo mettere nella lista siano dei null.
… Ma posso sbagliare …
yes!
dimmi, sto seguendo a distanza, a come vedo siete tutti più avanti.
ps ma il codice postato da Sergio, per farlo funzionare in Gh come si deve modificare?
Apparentemente Salvio, personalmente sono al tuo livello secondo me, gli altri si lo sono. Vorrà dire che noi saremo i discenti
Credo occorra solo un output di stringa, quindi memorizzare quanto restituito dal writeline.
Le classi chiamate vanno messe sotto dove ci ci sono le personalizzazioni.
si questo ci sono riuscito, adesso non mi da errore ma non riesco a mettere il risultato in output A
le classi anche in Python non le ho mai capite bene come chiamarle ed assegnarle un valore
private void RunScript(object x, object y, ref object A, ref object C)
{
List<Point3d> pts = new List<Point3d>();
System.Random rnd = new System.Random(8);
for(int i = 0;i < 9;i++)
pts.Add(new Point3d(i, rnd.NextDouble(), 0));
C = Curve.CreateInterpolatedCurve(pts, 3);
List<Point3d> P = pts;
A = P;
}
// <Custom additional code>
// </Custom additional code>
}
in queste poche righe si crea una lista di punti con la rispettiva curva interp
la curva viene inserita in output C mentre i punti in output A e fin qui ci arrivo
private void RunScript(object x, object y, ref object A)
{
}
// <Custom additional code>
class HelloLuca {
interface IDis
{
void Disegna();
}
class A: IDis
{
public void Disegna(){
Console.WriteLine("Sono la classe A");
}
}
class B: IDis
{
public void Disegna(){
Console.WriteLine("Sono la classe B");
}
}
static void Main() {
List<IDis> myList = new List<IDis>();
myList.Add(new A());
myList.Add(new B());
for (int i = 0;i < myList.Count;i++) {
myList[i].Disegna();
};
}
}
// </Custom additional code>
}
mentre in quest’altro esempi salto la stringa “private void RunScript”
ed inserisco il codice direttamente in “Custom additional code”
adesso il risultato della classe come lo associo output A?
Salvio, perche’ RunScript la chiami stringa ?
E’ una funzione o se vuoi un metodo.
Le stringhe sono tutt’altro.
L’esempio di Sergio e’ un normale programma C#, per quello usa Main() come punto di imizio e Console per l"output.
Per usarlo in GH devi adattarlo.
Io sposterei il contenuto di Main in RunScript e modificherei il metodo Disegna in modo che restituisca la strings invece di passarla a WriteLine, cosi’ puoi salvare le stringhe in una lista e poi copiarla su A per vedere l’output
ciao Emilio, potresti essere più chiaro?
nel codice di Sergio non vedo nessun Main() (per lo meno come ho sempre visto in vbs)
inserendo il codice nella funzione RunScript mi dava errore non so come modificarla
potresti fare qualche esempio?