Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Dudas OOP de un regresado a Delphi desde java. (https://www.clubdelphi.com/foros/showthread.php?t=70809)

setq 11-11-2010 23:29:36

Dudas OOP de un regresado a Delphi desde java.
 
Buenas, mi primer mensaje en este foro. Decir que vengo de java y creo tener la mayoria de conceptos de OOP claros. Hace dos años que no toco el Delphi, antes programaba muchisimo con él pero nunca pasaba de los formularios y no llegue a crear clases de cero, cosa que en java es a la orden del dia. Por tanto no se los entresijos de como implementa Delphi la OOP. Me gustaria aprenderlo lo mas rapidamente posible y por eso expondré preguntas sencillas de respuesta rápida para no cansar.

Lo primero que me ha dejado confuso es la clausula "class". Yo declaraba los objetos hace años con "object", no sabia que existia "class" en Delphi. Y si encima ademas permite usar "object" es cuando me confundo, asi que qué diferencia hay entre uno y otro?.

Referente a la visibilidad en las class y la encapsulacion:

Código:


type A = class
  var a:integer;
  procedure p1;
 
 private
  var b:integer;
  procedure p2;

 public
  var c:integer;
  constructor Create;
end;

La variable a y el procedimiento p1 son publicos, privados, o como?. No seran estaticos por casualidad, o sea, de clase?.

Si no fueran estaticos, como se declararian los procedimientos y variables de clase, o sea, estaticos?.

Si declaro en la seccion interface de la misma unit una constante fuera de la clase, una instancia de esa clase en la seccion implementation vera la constante?.

La vera una instancia de otra clase en otra unit que haga uso (uses) de la anterior?.

El constructor debe llamarse siempre Create o puede llamarse como yo quiera y por tanto haber varios constructores?.

Inherits es como el super(); de java?.

Existe la sobrecarga de procedimientos y funciones en Delphi?.

He visto algo de declaraciones con interface, es que existen las interfaces
en Delphi?.

En caso afirmativo, como se declararia una clase que implementa a una interfaz?

En internet solo he encontrado manuales basicos para iniciarse en Delphi. Conocen algun manual o tutorial que vaya al grano, para programadores avanzados, es decir, como un resumen que me ponga al dia rapidamente en Delphi y sus particularidades con la OOP.

PD: Si que lei la guia de estilo y se que son muchas preguntas, pero todas pertenecen a la misma inquietud y creo que no procede abrir un hilo para cada una.

Gracias.

rgstuamigo 12-11-2010 00:35:31

Bueno son demasiadas preguntas, pero vamos a tratar de responderte las que podamos, Aclaro que no me considero un master en delphi ni en POO ;).
Cita:

Empezado por setq (Mensaje 382112)
...
Lo primero que me ha dejado confuso es la clausula "class". Yo declaraba los objetos hace años con "object", no sabia que existia "class" en Delphi. Y si encima ademas permite usar "object" es cuando me confundo, asi que qué diferencia hay entre uno y otro?.
...

De la ayuda de Delphi 7>
Cita:

As an alternative to class types, you can declare object types using the syntax

type objectTypeName = object (ancestorObjectType)
memberList
end;

where objectTypeName is any valid identifier, (ancestorObjectType) is optional, and memberList declares fields, methods, and properties. If (ancestorObjectType) is omitted, then the new type has no ancestor. Object types cannot have published members.

Since object types do not descend from TObject, they provide no built-in constructors, destructors, or other methods. You can create instances of an object type using the New procedure and destroy them with the Dispose procedure, or you can simply declare variables of an object type, just as you would with records.

Object types are supported for backward compatibility only. Their use is not recommended.
En otras palabras se puede crear clases de ambas formas, tanto usando Object como Class, pero yo aconsejo a usar mejor la segunda para una mejor compresion y por que ya estamos acostumbrados.;)
Cita:

Empezado por setq (Mensaje 382112)
Referente a la visibilidad en las class y la encapsulacion:

Código:


type A = class
var a:integer;
procedure p1;

private
var b:integer;
procedure p2;

public
var c:integer;
constructor Create;
end;

La variable a y el procedimiento p1 son publicos, privados, o como?. No seran estaticos por casualidad, o sea, de clase?.

Tanto la varible "a" y el Procedimiento p1 son Publicos.;)
Cita:

Empezado por setq (Mensaje 382112)
Si no fueran estaticos, como se declararian los procedimientos y variables de clase, o sea, estaticos?.

Un método estático de clase se define así:
Código Delphi [-]
type
  TFigure = class
  public
    class function Supports(Operation: string): Boolean;
    class procedure GetInfo(var Info: TFigureInfo);
    ...
  end;
Y su implementacion de uno de ellos por ejemplo sería:

Código Delphi [-]
class procedure TFigure.GetInfo(var Info: TFigureInfo);
begin
  ...
end;
Las varibles estáticas no existe en delphi a menos yo no las conosco.
Sinembargo creo saber que apartir de Delphi 2007 se han agregado muchas cosas al lenguaje Delphi como tal, para lo cual te recomiendo leer sin flojear estas nueves (1, 2, 3, 4, 5, 6, 7, 8 y 9 ) partes de este estupendo artículo.
Cita:

Empezado por setq (Mensaje 382112)
Si declaro en la seccion interface de la misma unit una constante fuera de la clase, una instancia de esa clase en la seccion implementation vera la constante?.
La vera una instancia de otra clase en otra unit que haga uso (uses) de la anterior?

Explicate un poco mejor y si es posible con ejemplo.;)
Cita:

Empezado por setq (Mensaje 382112)
El constructor debe llamarse siempre Create o puede llamarse como yo quiera y por tanto haber varios constructores?.

Puede llamarse lo que sea, siempre y cuando se tenga cuidado de hacer bien las cosas, ademas lo ideal es usar siempre el nombre Create, ya que por estandar la mayoria de los programadores lo utilizamos y ademas aprovechamos la herencia ya que toda clase en delphi tiene como ancestro a la clase TObject.;)
Cita:

Empezado por setq (Mensaje 382112)
Inherits es como el super(); de java?.

Se prodría :rolleyes: decir que sí, aunque existe cierta diferencia diría yo.;)
Cita:

Empezado por setq (Mensaje 382112)
Existe la sobrecarga de procedimientos y funciones en Delphi?.

Por supuesto que si.
Cita:

Empezado por setq (Mensaje 382112)
He visto algo de declaraciones con interface, es que existen las interfaces
en Delphi?.

En caso afirmativo, como se declararia una clase que implementa a una interfaz?

Mira estos artículos sin flojear> 1, 2 y 3 .;)
Espero haberte podido ayudar.;)
Saludos...:)

Delphius 12-11-2010 02:30:06

Te lo hago más fácil( no es que quiera desmerecer a rgstuamigo que se ha dedicado y tomado el tiempo a buscar y comentar al respecto): lee el libro La Cara Oculta de Delphi, que trae todo un capítulo dedicado al tema POO y también más adelante, al tema de las Interfaces. ;)

Saludos,

Al González 12-11-2010 07:36:27

Bienvenido tu regreso al mundo Delphi, setq, donde la sintaxis del lenguaje es, por decirlo, más humana. ;)

Loo el esmero de Roberto para responderte y secundo la atinada recomendación de Marcelo.

Aporto un grano de arena:

Cita:

Empezado por setq (Mensaje 382112)
Si declaro en la seccion interface de la misma unit una constante fuera de la clase, una instancia de esa clase en la seccion implementation vera la constante?.

La vera una instancia de otra clase en otra unit que haga uso (uses) de la anterior?

La respuesta para ambas preguntas es sí. Todo identificador declarado en la sección Interface de una unidad, mientras no se encuentre restringido dentro de una clase, tiene ámbito global, y por tanto puede ser accedido desde cualquier parte del código dentro o fuera de dicha unidad.

Un saludo.

Al González. :)

setq 12-11-2010 13:22:48

Me voy a leer sin flojear esos articulos que parece que son lo que buscaba, algo breve y rapido.

Delphius, gracias por la recomendacion del libro, ya lo conocia pero necesito ponerme al dia cuanto antes con algo mas breve, y lo de mgstuamigo creo que me va mejor.

Y gracias por las respuestas, ya tengo algo andado.

Nos leemos en mi proxima duda!.

Saludos.

rgstuamigo 12-11-2010 21:54:15

Cita:

Empezado por rgstuamigo (Mensaje 382116)
...
Las variables estáticas no existe en delphi a menos yo no las conosco.
Sinembargo creo saber que apartir de Delphi 2007 se han agregado muchas cosas al lenguaje Delphi como tal...

Me corrijo: Pues sí se puede declarar variables estáticas o de clase, e incluso constantes estáticas:eek:, pero solo a partir de la version Delphi 2007 hacia adelante ;), eso lo podemos ver en la parte número 6 del artículo que mencioné en mi anterior post.;)
Código Delphi [-]
TAlumno = class
class var
  Nombre: String;//<--Variable estática ;)
public
  class procedure SetNombre( N: String );//<-Método estáticos
  class function GetNombre: String;//<-Método estáticos
end;
Lástimosamente en mi Delphi 7 aún no se contaba con las declaracion de Variables estáticas o de clase, pero para los que poseen una version de Delphi 2007,Delphi 2009, Delphi 2010 o la última que es Delphi XE, pues tranquilamente pueden hacer uso de tal caracteristica:p.
Saludos...:)

yapt 14-11-2010 12:41:03

Siendo estrictos y siguiendo el ejemplo de rgstuamigo los métodos estáticos deberían declararse tal que así:
Código Delphi [-]
TAlumno = class
class var
  Nombre: String;//<--Variable estática ;)
public
  class procedure SetNombre( N: String ); static;//<-Método estáticos
  class function GetNombre: String; static;//<-Método estáticos
end;

Tal y como se indica en uno de los mejores documentos de Embarcadero que yo haya leido nunca (por su claridad y concisión):
http://edn.embarcadero.com/article/34324

Saludos.


La franja horaria es GMT +2. Ahora son las 16:32:56.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi