Arquivo da categoria ‘C#’

Struct – Estrututas – C++ e C#

Publicado: 14 de março de 2014 em C#, C/C++

Na Ciência da computação, uma estrutura de dados é um modo particular de armazenamento e organização de dados em um computador de modo que possam ser usados eficientemente.

Diferentes tipos de estrutura de dados são adequadas a diferentes tipos de aplicação e algumas são altamente especializadas, destinando-se a algumas tarefas específicas.

Struct

A palavra-chave estrutura define um tipo de estrutura e / ou de uma variável de um tipo de estrutura. Um tipo struct é um tipo de valor que normalmente é usado para encapsular pequenos grupos de variáveis ​​relacionadas, tais como as coordenadas de um retângulo ou as características de um item em um inventário.

É uma declaração que define uma lista de variáveis ​​a serem colocados sob o mesmo nome em um bloco de memória, permitindo que as diferentes variáveis ​​possam ser acessadas através de um único ponteiro.

O struct é uma palavra chave derivada da linguagem C, e não possui seu equivalente em Java, mas possui seu equivalente em ABAP e Python.

Abap : https://desenvolvimentoaberto.wordpress.com/2014/02/20/tipos-complexos-structures-abap/

Em Python um tuplas também pode armazenar diferentes tipos dentro de uma estrutura: https://desenvolvimentoaberto.wordpress.com/2014/02/22/tuples-tuplas-python-linux/

Exemplo:

Neste programa criamos uma estrutura de clientes.

C++

#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

struct Cliente
{
	string nome;
	string logradouro;
	string endereco;
	int numero;
	string complemento;
	string bairro;
	string cidade;
	string contato;
	string cargo;
	int cep;
	long RG;
	long cpf;

};

int _tmain(int argc, _TCHAR* argv[])
{
	Cliente dados;

		dados.nome = "Instituto Brasileiro de Geografia e Estatística";
		dados.logradouro = "Avenida";
		dados.endereco = "Beira Mar";
		dados.numero = 436;
		dados.complemento = "13o Andar";
		dados.bairro = "Castelo";
		dados.cep = 20021060;
		dados.cidade = "Rio de Janeiro";
		dados.contato = "Mario de Oliveira Aguiar";
		dados.cargo = "Gerente";
		dados.RG = 999999999;
		dados.cpf = 99999999999;

		cout << "Empresa: " << dados.nome << endl;
		cout << dados.logradouro << " " << dados.endereco << " " <<
			dados.numero << " " << dados.complemento << endl;
		cout << "Cep: " << dados.cep << " " << dados.bairro << " " << dados.cidade << endl;
		cout << endl;
		cout << "Contato: " << dados.contato << " - " << dados.cargo << endl;
		cout << "Rg: " << dados.RG << " - Cpf: " << dados.cpf << endl;

		cout << endl;
		system("pause");

	return 0;
}

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesenvolvimentoAberto
{
    class Program
    {
         struct Cliente
        {
            public string nome;
            public string logradouro;
            public string endereco;
            public int numero;
            public string complemento;
            public string bairro;
            public string cidade;
            public string contato;
            public string cargo;
            public int cep;
            public long RG;
            public long cpf;
        }
        static void Main(string[] args)
        {
            Cliente dados = new Cliente();

            dados.nome = "Instituto Brasileiro de Geografia e Estatística";
            dados.logradouro = "Avenida";
            dados.endereco = "Beira Mar";
            dados.numero = 436;
            dados.complemento = "13o Andar";
            dados.bairro = "Castelo";
            dados.cep = 20021060;
            dados.cidade = "Rio de Janeiro";
            dados.contato = "Mario de Oliveira Aguiar";
            dados.cargo = "Gerente";
            dados.RG = 999999999;
            dados.cpf = 99999999999;

            Console.WriteLine( "Empresa: " + dados.nome);
            Console.WriteLine( dados.logradouro + " " + dados.endereco + " " +
                dados.numero + " " + dados.complemento);
            Console.WriteLine( "Cep: " + dados.cep + " " + dados.bairro + " " + dados.cidade );
            Console.WriteLine();
            Console.WriteLine( "Contato: " + dados.contato + " - " + dados.cargo);
            Console.WriteLine( "Rg: " + dados.RG + " - Cpf: " + dados.cpf );

            Console.WriteLine( );
            Console.ReadKey();
        }

    }
}

RadioButton

Em computação, um botão de opção ou botão de rádio (radio button) é um elemento de interface gráfica (isto é um componente widget) com dois estados: selecionado (ativado) e não-selecionado (desativado), quando o usuário pressiona um botão do mouse ou uma tecla como Espaço. Botões de opção são usados num grupo para apresentar um conjunto limitado de escolhas (duas ou mais) que são mutuamente exclusivas. Deste maneira, quando o usuário seleciona um outro botão no mesmo conjunto, o outro botão já selecionado torna-se automaticamente desativado.

EventHandler

O conceito do Sistema operacional Windows é baseado no envio e recebimento de mensagens e este procedimento é chamado de Windows Messages , na verdade  o sistema em baixo nível é composto de vários tipos de mensagens que contém  múltiplos eventos. Eventos em um aplicativo do Windows são ocorrências como ao usuário clicar com o mouse ou pressionando uma tecla ou se um temporizador atingir zero

O sistema operacional Windows registra cada evento em uma mensagem e coloca a mensagem em uma fila de mensagens para o programa para o qual a mensagem se destina. Assim uma mensagem do Windows é simplesmente um registro dos dados relativos a um evento, e a fila de mensagens para uma aplicação é apenas uma sequência de tais mensagens aguardando para serem processados pela aplicação, por envio de uma mensagem, o Windows pode dizer ao seu programa de que algo precisa ser feito, ou que algum informação tornou-se disponível, ou que um evento como um clique do mouse ocorreu. Se o seu programa está devidamente organizado, ele vai responder de forma adequada à mensagem. Tem muitos tipos diferentes de mensagens e elas podem ocorrer com muita frequência, muitas vezes até por segundo quando o mouse está sendo arrastado, por exemplo.

Quando você programa em C# você esta utilizando estas mensagens em um alto nível e pode programar eventos predefinifos que são interpretados pelo framework  e suas classes,  compilando o seu código para uma língua intermediária chamada MSIL (Microsoft Intermediate Language) e transformado em código de maquina pelo componente Just in time (JIT), assim que o seu programa é executado.

No código abaixo nosso programa esta completamente dentro de eventos, o evento Form_Shown é executado assim que o form é exibido, o evento Button_Click, é executado assim que o usuário clica no botão, o  evento RadioButton_CheckedChanged é executado quando há uma mudança no estado de cheque de um botão de radio e o evento Form_KeyDown é executado quando uma tecla é pressionada.

Código Dinâmico

Lembre-se que o C# no Visual Studio usa o conceito Design First, Code Later, nosso exemplo é um programa dinâmico ou seja todo escrito em tempo de execução e não em Design Time, quando criar o novo projeto click no form, na janela propriedades, no botão eventos, escolha o evento Shown e de um duplo click para acessar a unidade de código csharp. Para ilustrar esta explicação veja a imagem abaixo, onde você vê o form em Design Time e ao lado o programa em Run Time.

Radiobutton

Exemplo:

Neste exemplo criamos um grupo de botões de radio que efetua as 4 operações básicas da matemática, usando o evento de item e a verificação do seu estado.

C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DesenvolvimentoAberto
{

    public partial class Form1 : Form
    {
        // Define componentes
        Label rotulo;
        RadioButton soma;
        RadioButton subtrai;
        RadioButton multiplica;
        RadioButton divide;
        Label rotulo1;
        TextBox campo1;
        Label rotulo2;
        TextBox campo2;
        Button botao;
        TextBox texto;
        double total;




        // Construtor
        public Form1()
        {
            InitializeComponent();
        }


        // Evento Shown é executado quando o form é exibido
        private void Form1_Shown(object sender, EventArgs e)
        {
            // Cria componentes dinamicamente no evento form shown
            rotulo = new Label();
            soma = new RadioButton();
            subtrai = new RadioButton();
            multiplica = new RadioButton();
            divide = new RadioButton();
            rotulo1 = new Label();
            campo1 = new TextBox();
            rotulo2 = new Label();
            campo2 = new TextBox();
            botao = new Button();
            texto = new TextBox();

            // posiciona componentes no form
            rotulo.Location = new Point (5, 10);
            soma.Location = new Point (5, 30);
            subtrai.Location = new Point(5, 50);
            multiplica.Location = new Point(5, 70);
            divide.Location = new Point(5, 90);
            rotulo1.Location = new Point(5, 120);
            campo1.Location = new Point(60, 120);
            rotulo2.Location = new Point(170, 120);
            campo2.Location = new Point(220, 120);
            botao.Location = new Point(330, 120);
            texto.Location = new Point(5, 150);

            // adiciona a propriedade de texto nos componentes
            rotulo.Text = "Escolha um RadioButton ou pressione (A, B, C ou D) ou (Alt + A, B, C ou D)";
            soma.Text = "Som&a";
            subtrai.Text = "Su&btrai";
            multiplica.Text = "Multipli&ca";
            divide.Text = "&Divide";
            rotulo1.Text = "Numero:";
            rotulo2.Text = "Numero:";
            botao.Text = "OK";

            // seta a propriedades para a caixa de texto
            texto.Multiline = true;
            texto.ScrollBars = ScrollBars.Vertical;
            texto.ReadOnly = true;

            // Define o tamanho dos objetos no form
            Form1.ActiveForm.Size = new Size(500, 300);
            rotulo.Size = new Size(450, 20);
            soma.Size = new Size(130, 20);
            subtrai.Size = new Size(130, 20);
            multiplica.Size = new Size(130, 20);
            divide.Size = new Size(130, 20);
            texto.Size = new Size(410, 100);
            rotulo1.Size = new Size(50, 20);
            rotulo2.Size = new Size(50, 20);

            // Define eventos para o checkbox
            soma.CheckedChanged += new System.EventHandler(soma_CheckedChanged);
            subtrai.CheckedChanged += new System.EventHandler(subtrai_CheckedChanged);
            multiplica.CheckedChanged += new System.EventHandler(multiplica_CheckedChanged);
            divide.CheckedChanged += new System.EventHandler(divide_CheckedChanged);
            botao.Click += new System.EventHandler(botao_Click);

            // Ativa a previsão de teclas do form
            Form1.ActiveForm.KeyPreview = true;

            // Nome do form
            Form1.ActiveForm.Text = "Desenvolvimento Aberto";
            // Adiciona componentes ao form
            Form1.ActiveForm.Controls.Add(rotulo);
            Form1.ActiveForm.Controls.Add(soma);
            Form1.ActiveForm.Controls.Add(subtrai);
            Form1.ActiveForm.Controls.Add(multiplica);
            Form1.ActiveForm.Controls.Add(divide);
            Form1.ActiveForm.Controls.Add(rotulo1);
            Form1.ActiveForm.Controls.Add(campo1);
            Form1.ActiveForm.Controls.Add(rotulo2);
            Form1.ActiveForm.Controls.Add(campo2);
            Form1.ActiveForm.Controls.Add(botao);
            Form1.ActiveForm.Controls.Add(texto);

        }

        // Evento On Click do botão
        private void botao_Click(object sender, EventArgs e)
        {
           if (soma.Checked)
           {
               total = Convert.ToDouble(campo1.Text) + Convert.ToDouble(campo2.Text);
               texto.AppendText(campo1.Text + " + " + campo2.Text + " = " + total + "\n");
           }

           if (subtrai.Checked)
           {
               total = Convert.ToDouble(campo1.Text) - Convert.ToDouble(campo2.Text);
               texto.AppendText(campo1.Text + " - " + campo2.Text + " = " + total + "\n");
           }

           if (multiplica.Checked)
           {
               total = Convert.ToDouble(campo1.Text) * Convert.ToDouble(campo2.Text);
               texto.AppendText(campo1.Text + " * " + campo2.Text + " = " + total + "\n");
           }

            if (divide.Checked)
           {
               total = Convert.ToDouble(campo1.Text) / Convert.ToDouble(campo2.Text);
               texto.AppendText(campo1.Text + " / " + campo2.Text + " = " + total + "\n");
           }
        }

        // Evento do RadioButton de mudança de estado
        // Verifica o estado pois este evento executa duas vezes
        // Quando o botão é selecionado e deselecionado
        // Duplicanto o texto enviado a caixa de texto.
        private void soma_CheckedChanged(object sender, EventArgs e)
        {
            if (soma.Checked)
            {
                texto.AppendText("Soma:\n");
            }
        }

        private void subtrai_CheckedChanged(object sender, EventArgs e)
        {
            if (subtrai.Checked)
            {
                texto.AppendText("Subtração:\n");
            }
        }
        private void multiplica_CheckedChanged(object sender, EventArgs e)
        {
            if (multiplica.Checked)
            {
                texto.AppendText("Multiplicação:\n");
            }
        }

        private void divide_CheckedChanged(object sender, EventArgs e)
        {
            if (divide.Checked)
            {
                texto.AppendText("Divisão:\n");
            }
        }

        // Evento de tecla pressionada
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {

            if  (e.KeyCode == Keys.A)
            {

                    if (soma.Checked == true)
                    {
                        soma.Checked = false;
                    }
                    else
                    {
                        soma.Checked = true;
                    }

            }
            if (e.KeyCode == Keys.B)
            {

                if (subtrai.Checked == true)
                {
                    subtrai.Checked = false;
                }
                else
                {
                    subtrai.Checked = true;
                }

            }

            if (e.KeyCode == Keys.C)
            {

                if (multiplica.Checked == true)
                {
                    multiplica.Checked = false;
                }
                else
                {
                    multiplica.Checked = true;
                }

            }

            if (e.KeyCode == Keys.D)
            {

                if (divide.Checked == true)
                {
                    divide.Checked = false;
                }
                else
                {
                    divide.Checked = true;
                }

            }

        }
    }
}

Access Keys

Uma tecla de acesso é um caractere sublinhado no texto de um menu, item de menu, ou o rótulo de um controle como um botão. Ele permite o usuário “clicar” em um botão, pressionando a tecla ALT em combinação com a tecla de acesso predefinido. Por exemplo, se um botão executa um procedimento para imprimir um formulário, e, portanto, sua propriedade Text é definido como “Imprimir”, acrescentando um e comercial antes da letra “i” faz com que a letra “i”, seja sublinhada no texto do botão em tempo de execução tempo. O usuário pode executar o comando associado ao botão pressionando ALT + I. Você não pode ter uma chave de acesso para um controle que não pode receber o foco, por exemplo, um controle TabPage.

CheckBox

Representa um CheckBox do Windows

CheckedChanged

Ocorre quando o valor da propriedade Checked muda entre postagens para o servidor.

TextBox

Representa um controle de caixa de texto do Windows.

KeyPreview

Obtém ou define um valor indicando se o formulário receberá eventos de teclas antes do evento ser passado para o controle que tem o foco.

HotKeys

É o termo utilizado para teclas de atalho em C#

Keys Enumeration

Esta enumeração tem um atributo FlagsAttribute que permite uma combinação bit a bit de seus valores de membro. Pode ser usado através da classe Keys.

KeyDown

É um evento que ocorre quando uma tecla é pressionada enquanto o controle tem foco.

Exemplo:

Neste exemplo mostramos como usar o componente checkbox seus eventos e como usar hotkeys para manipular o checkbox e imprimir o resultado dentro de um componente textbox.

C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication14
{

    public partial class Form1 : Form
    {
        // Define componentes
        Label rotulo;
        CheckBox opc1;
        CheckBox opc2;
        CheckBox opc3;
        TextBox texto;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            // Cria componentes dinamicamente no evento form shown
            rotulo = new Label();
            opc1 = new CheckBox();
            opc2 = new CheckBox();
            opc3 = new CheckBox();
            texto = new TextBox();

            // posiciona componentes no form
            rotulo.Location = new Point (5, 10);
            opc1.Location = new Point (5, 30);
            opc2.Location = new Point(5, 50);
            opc3.Location = new Point(5, 70);
            texto.Location = new Point(5, 100);

            // adiciona a propriedade de texto nos componentes
            rotulo.Text = "Escolha um Checkbox ou pressione A, B ou C:";
            opc1.Text = "Opção 1 - Alt + &X";
            opc2.Text = "Opção 2 - Alt + &Y";
            opc3.Text = "Opção 3 - Alt + &Z";

            // seta a propriedades para a caixa de texto
            texto.Multiline = true;
            texto.ScrollBars = ScrollBars.Vertical;
            texto.ReadOnly = true;

            // Define o tamanho dos objetos no form
            rotulo.Size = new Size(250, 20);
            opc1.Size = new Size(130, 20);
            opc2.Size = new Size(130, 20);
            opc3.Size = new Size(130, 20);
            texto.Size = new Size(250, 100);

            // Define eventos para o checkbox
            opc1.CheckedChanged += new System.EventHandler(opc1_CheckedChanged);
            opc2.CheckedChanged += new System.EventHandler(opc2_CheckedChanged);
            opc3.CheckedChanged += new System.EventHandler(opc3_CheckedChanged);

            // Ativa a previsão de teclas do form
            Form1.ActiveForm.KeyPreview = true;

            // Nome do form
            Form1.ActiveForm.Text = "Desenvolvimento Aberto";
            // Adiciona componentes ao form
            Form1.ActiveForm.Controls.Add(rotulo);
            Form1.ActiveForm.Controls.Add(opc1);
            Form1.ActiveForm.Controls.Add(opc2);
            Form1.ActiveForm.Controls.Add(opc3);
            Form1.ActiveForm.Controls.Add(texto);

        }

        // Eventos do checkbox
        private void opc1_CheckedChanged(object sender, EventArgs e)
        {
            texto.AppendText("Você clicou no checkbox 1\n");
        }

        private void opc2_CheckedChanged(object sender, EventArgs e)
        {
            texto.AppendText("Você clicou no checkbox 2\n");
        }
        private void opc3_CheckedChanged(object sender, EventArgs e)
        {
            texto.AppendText("Você clicou no checkbox 3\n");
        }

        // Evento de tecla pressionada
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {

            if  (e.KeyCode == Keys.A)
            {

                    if (opc1.Checked == true)
                    {
                        opc1.Checked = false;
                    }
                    else
                    {
                        opc1.Checked = true;
                    }

            }

            if (e.KeyCode == Keys.B)
            {

                if (opc2.Checked == true)
                {
                    opc2.Checked = false;
                }
                else
                {
                    opc2.Checked = true;
                }

            }

            if (e.KeyCode == Keys.C)
            {

                if (opc3.Checked == true)
                {
                    opc3.Checked = false;
                }
                else
                {
                    opc3.Checked = true;
                }

            }

        }
    }
}

Por default no Visual Studio um projeto visual já cria o primeiro formulário para o desenvolvedor como já vimos no post anterior, e é muito mais fácil desenvolver usando os componentes em Design Time, mas como em Java o C# também pode ser manipulado usando somente código fonte e este tipo de codificação chama-se: código dinâmico. Dependo do tipo de software que você esta desenvolvendo códigos dinâmicos são um recurso extremamente útil.

Desenvolvedores puristas preferem escrever códigos dinamicamente, estes deixam o código mais limpo e mais leve e as vezes até mais rápido  do que IDEs de Design Time, que criam um arquivo extra para gerenciar os componentes e suas posições na tela.

Controles Básicos

Para criar programas em C# você precisa conhecer os controles básicos, programadores iniciantes sabem usar as propriedades de objetos como por exemplo, a classe Size (tamanho) usando o inspetor de objetos, mas na hora de criar controles de tamanho e posições de tela dinamicamente se embaralham um pouco, pois não se pode atribuir os valores diretamente como se faz no inspetor de objetos, é necessário o uso de classes para fazer este trabalho.

Point

Representa um par ordenado de inteiros X e Y de coordenadas que define um ponto em um plano bidimensional.

Size

Armazena um par ordenado de números inteiros, que especificam a altura e largura.

Form

Representa uma janela ou caixa de diálogo que compõe a interface de usuário do aplicativo

Label

Representa o rótulo de texto para um controle e fornece suporte para teclas de acesso.

TextBox

Representa um controle de caixa de texto do Windows.

Button

Representa um controle de botão do Windows.

EventHandler

Representa o método que manipulará um evento que não tem dados do evento. O modelo de evento no .NET Framework. Baseia-se em ter um representante do evento que conecta um evento com seu manipulador.

Exemplo:

Neste exemplo criamos dinamicamente os controles básicos e um evento para um programa que concatena duas strings.

C#


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DesenvolvimentoAberto
{
    public partial class Form1 : Form
    {
        // Cria Componentes
        Label rotulo = new Label();
        TextBox texto1 = new TextBox();
        TextBox texto2 = new TextBox();
        Button botao = new Button();
        Label resultado = new Label();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            // Altera titulo do formulario
            Form1.ActiveForm.Text = "Desenvolvimento Aberto";

            // Seta valores para as propriedades dos objetos
            rotulo.Text = "Concatena Strings:";
            rotulo.Location = new Point(5, 5);

            texto1.Text = "Digite uma String";
            texto1.Location = new Point(5, 30);
            texto1.Size = new Size(200, 20);

            texto2.Text = "Digite uma String";
            texto2.Location = new Point(5, 60);
            texto2.Size = new Size(200, 20);

            botao.Text = "Somar";
            botao.Location = new Point(5, 85);

            // Delega evento OnClick para o botão
            botao.Click += new System.EventHandler(botao_Click);

            resultado.Text = "Resultado:";
            resultado.Location = new Point(5, 110);
            resultado.Size = new Size(300, 20);

            // Adiciona objetos no formulário
            Form1.ActiveForm.Controls.Add(rotulo);
            Form1.ActiveForm.Controls.Add(texto1);
            Form1.ActiveForm.Controls.Add(texto2);
            Form1.ActiveForm.Controls.Add(botao);
            Form1.ActiveForm.Controls.Add(resultado);
        }

        // Método OnClick do botão
        private void botao_Click(object sender, EventArgs e)
        {
            resultado.Text = texto1.Text + texto2.Text;
        }

    }
}

Visual – Introdução – Design Time .NET – C#

Publicado: 7 de março de 2014 em C#

C# é uma linguagem totalmente amigável do ponto de vista visual, segue a linha do antigo Delphi, usando método de design time, onde você pode arrastar os componentes da caixa de ferramentas(toolbox) diretamente para o formulário e inspecionar as propriedades e eventos dos objetos usando sua janela de propriedades. Também é possível criar objetos dinamicamente, para criar um programa visual em C# siga os passos abaixo:

Visual Studio

  1. No menu File, clique em New, Project.
  2. Na caixa de dialogo para projetos C#, escolha  Windows Forms Application.
  3. Nomeie o projeto para Hello e clique em OK.
  4. No modo Design de um duplo clique no Form1 para acessar o arquivo Form1.cs.
  5. Renomeie o namespace para: DesenvolvimentoAberto.
  6. Digite a void Form1_Shown do exemplo abaixo.

Exemplo:

Neste exemplo o C# cria um formulário automaticamente na abertura do projeto e vamos adicionar um objeto label dinamicamente e manipular algumas de suas propriedades.

C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DesenvolvimentoAberto
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            // Cria um label dinamicamente
            Label label = new Label();
            label.Text = "Hello World";
            label.Visible = true;

            // troca o nome do formulario na barra de titulos
            Form1.ActiveForm.Text = "Hello World";

            // Adiciona o label no formulario
            Form1.ActiveForm.Controls.Add(label);

        }
    }
}

Iterator

Em português iterador, é um objeto que permite a um programador examinar uma coleção ou container. Vários tipos de iteradores são frequentemente fornecidos através de uma interface de container. Apesar da interface e semântica de um determinado iterador serem fixas, iteradores são frequentemente implementados em termos de estruturas subjacentes a uma implementação de container e são muitas vezes ligados intimamente ao container para permitir a semântica operacional do iterador.

Observe que um iterador percorre e também dá acesso aos elementos de dados em um container, mas não realiza iteração (isto é, não sem alguma liberdade significativa tomada com este conceito ou com uso trivial da terminologia). Um iterador é tem um comportamento semelhante a um cursor de banco de dados. Iteradores datam da linguagem de programação CLU de 1974.

Collection

É uma coleção, às vezes chamada de um recipiente(container), é simplesmente um objeto que agrupa vários elementos em uma única unidade. Coleções são usadas ​​para armazenar, recuperar, manipular e comunicar dados agregados, ou seja uma coleção é um objeto que contém outros objetos, existem outras coleções com diferentes capacidades.

Historicamente, o quadro de coleções têm sido bastante complexo, o que lhes deu uma reputação de ter uma grande curva de aprendizagem. Os exemplos mais conhecidos de frameworks de coleções são o C ++ Standard Template Library (STL). A nomenclatura das APIs e suas sintaxes podem mudar de uma linguagem de programação para outra.

O framework de coleção e as suas APIs:

Collection é a raiz da hierarquia do conjunto. A coleção representa um grupo de objetos conhecidos como seus elementos.

A interface Collection é o mínimo denominador comum que todos os conjuntos implementam e é usado para passar coleções para manipular objetos quando generalidade máxima é desejada. Alguns tipos de coleções permitem elementos duplicados, e outros não.

  • SET – Está diretamente relacionada com a ideia de conjuntos. Assim como um conjunto, as classes que implementam esta interface não podem conter elementos repetidos.
  • List –  É uma coleção ordenada, pode conter valores duplicados, o controle da posição de cada elemento é acessado pelo seu índice.
  • Queue: é uma lista tipo FIFO (First-In-First-Out), também conhecida como fila.
  • Map: é uma lista de relação de chave-valor entre os elementos. Cada chave pode conter apenas um único valor associado.(um mapa não é uma coleção verdadeira).

Exemplos:

Neste exemplo criamos uma collection do tipo List e a alimentamos com nomes de musicas dos Beatles, usamos o iterator para navegar no dentro dos objetos da coleção como cursores de banco de dados, registro a registro, e os alteramos manualmente, fator que as coleções não permitem por default.

Java

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class Iterador
 {

 public static void main(String[] args)
 {
      List<String> colecao = new ArrayList<String>();

   // musicas dos Beatles
   colecao.add("Let it be");
   colecao.add("Dont let me down");
   colecao.add("Come togheter");
   colecao.add("Hey Jude");
   colecao.add("Twist and shout");

   // Usa iterator como um cursor de banco de dados
   Iterator<String>  iterador =  colecao.iterator();

   System.out.println("Cinco musicas dos Beatles:\n");

   while (iterador.hasNext())
   {
     Object item = iterador.next();
     System.out.println(item);
   }

   // Usa iterador como o result de um banco de dados.
   ListIterator<String>  iteradorLista = colecao.listIterator();

   // Update - altera lista
   while (iteradorLista.hasNext())
   {
     Object item = iteradorLista.next();
     iteradorLista.set("Beatles: " + item);
   }

   //Lista a coleção

   System.out.println("\nIverte a ordem da coleção:\n");
   while (iteradorLista.hasPrevious())
   {
     Object item = iteradorLista.previous();
     System.out.println(item);
   }
 }
}

C++

#include "stdafx.h"
#include <iostream>
#include <string>
#include <list>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
 {
  list<string> colecao;

  colecao.push_back("Let it be");
  colec}ao.push_back("Dont let me down");
  colecao.push_back("Come togheter");
  colecao.push_back("Hey Jude");
  colecao.push_back("Twist and shout");

  // Usa iterator como um cursor de banco de dados
  list<string>::const_iterator
  inicio(colecao.begin()),
  fim(colecao.end());

  list<string>::iterator altera;

  cout << "Cinco musicas dos Beatles:\n" << endl;
  for (; inicio != fim; ++inicio)
  {
   cout << *inicio << endl;
  }

// Usa iterador como o result de um banco de dados.
  // Update - altera lista
  for (altera = colecao.begin(); altera != colecao.end(); ++altera)
  {
    *altera =  "Beatles: " + *altera;
  }

  //Lista a coleção
  colecao.reverse();

  cout << "\nIverte a ordem da coleção:\n" << endl;

  for (altera = colecao.begin(); altera != colecao.end(); ++altera)
  {
   cout << *altera << endl;
  }
  system("pause");
  return 0;
 }

C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DesenvolvimentoAberto
 {
     class Program
     {
         static void Main(string[] args)
         {
             List<String> colecao = new List<String>();

        // musicas dos Beatles
       colecao.Add("Let it be");
       colecao.Add("Dont let me down");
       colecao.Add("Come togheter");
       colecao.Add("Hey Jude");
       colecao.Add("Twist and shout");

       // Usa iterator como um cursor de banco de dados
       Console.WriteLine("Cinco musicas dos Beatles:\n");
       foreach( string item in colecao)
       {
          Console.WriteLine(item);
       }

       // Usa iterador como o result de um banco de dados.
       // Update - altera lista
       int i = 0;
       while (i <= colecao.Count() -1)
       {
          colecao[i] = "Beatles: " + colecao.ElementAt(i);
          i = i + 1;
       }

       //Lista a coleção
       colecao.Reverse();
       Console.WriteLine("\nIverte a ordem da coleção:\n");
       foreach( string item in colecao)
       {
          Console.WriteLine(item);
       }
       Console.ReadKey();
}
    }
 }

Existem muitos estilos de programação e estes chamados de paradigmas. As linguagens mais antigas possuem o estilo processual (procedural) , pois da ênfase sobre a especificação computacional de procedimentos, enquanto as linguagens mais modernas são orientadas a objeto, as linguagens que evoluirão ou as que nasceram de uma linguagem de outro paradigma e ainda mantém as suas características seja por opção ou por compatibilidade, estas são chamadas de hibridas, que em ciência da computação é uma linguagem de programação que se baseia em elementos de mais de um paradigma de programação.

Um paradigma de programação fornece e determina a visão que o programador possui sobre a estruturação e execução do programa. Por exemplo, em programação orientada a objetos, programadores podem abstrair um programa como uma coleção de objetos que interagem entre si, enquanto em programação funcional os programadores abstraem o programa como uma sequência de funções executadas de modo empilhado.

Em linguagens multi paradigmas a maioria da programação hoje em dia é orientada a objeto, o que significa que o foco está em objetos e suas interações.

Em programação orientada a objetos existem dois tipos de métodos, chamados métodos de classe e métodos de objetos. Métodos de classe são identificados pela palavra-chave static na primeira linha. Qualquer método que não possua a palavra-chave static é um método de objeto. Este significado pode variar dependendo da linguagem de programação vide Python.

Então podemos dividir os métodos entre estáticos e não estáticos:

Estáticos: métodos estáticos não requerem uma instância da classe nem podem acessar implicitamente os dados (this, self, Me, etc.) de tal instância. Um método estático é distinguido em algumas linguagens de programação com a palavra-chave static colocada em algum lugar na assinatura do método.

Não Estáticos: métodos não estáticos requerem uma instância da classe e podem acessar implicitamente os dados (this, self, Me, etc.) de tal instância. Este método exige um tipo de código diferente da programação de códigos estáticos, pois está sempre se referindo a instancia do objeto e não da classe.

Código do Método Objeto:

  • Não declarar a instrução estática.
  • Nomear o  método para ser mais idiomático.
  • Remover o parâmetro da própria classe na declaração.
  • Dentro do método de objeto você deve se referir as variáveis ​​de instância como variáveis ​​locais.

Exemplo:

A por default a maioria das linguagens de  programação orientada a objetos fornecem um método chamado equals(igual) que define a equivalência entre objetos As classes default fornecem o método  equals que já faz toda a coisa do modo correto. Mas para os tipos definidos pelo usuário o comportamento padrão é o mesmo que identidade, que normalmente não é o resultado que você quer. Então tudo o que temos a fazer é reescrever o método  equals para nosso objeto.

O modo correto é criar uma função Override para o método equals, mas aqui vamos escrever a função com o nome traduzido para que fique claro a diferença entre métodos de classe e métodos de objeto, que é o objetivo deste post.

Java

Classe #1

public class Program
 {

public static void main(String[] args)
 {
   // Instancia dos Objetos

   Quadrado q1 = new Quadrado(32);
   Quadrado q2 = new Quadrado(32);

   System.out.println("Verifica se os Objetos são iguais\n");

   // Usa método da Classe
   System.out.print("Testa método da classe:");
   System.out.println(Quadrado.iguaisQ(q1, q2));

   // Usa método do Objeto
   System.out.print("Testa método do objeto:");
   System.out.println(q1.iguais(q2));
  }
}

Classe #2

public class Quadrado
 {
    private double lado;
Quadrado (double lado)
     {
      this.lado = lado;
     }
     // Método da Classe - Estatico
     static public boolean iguaisQ(Quadrado q1, Quadrado q2)
     {
      return (q1.lado == q2.lado);
     }
     // Método do Objeto  - Não Estatico
     public boolean iguais(Quadrado q2)
     {
      return (lado == q2.lado);
     }
}

C++

Classe #1

#include "stdafx.h"
#include <iostream>
#include "Quadrado.h"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
 {

  // Instancia dos Objetos
  Quadrado q1 (32);
  Quadrado q2 (32);

  cout << "Verifica se os Objetos são iguais\n" << endl;

  // Usa método da Classe
  cout << "Testa método da classe:";
  cout << Quadrado::iguaisQ(q1, q2) << endl;

  // Usa método do Objeto
  cout << "Testa método do objeto:";
  cout << q1.iguais(q2) << endl;
  system("pause");
  return 0;
 }

Classe #2

#include "stdafx.h"
#include <iostream>
using namespace std;

class Quadrado
 {
 private:

 double lado;

 public:

 Quadrado(double lado)
  {
   this->lado = lado;
  }

  // Método da Classe - Estatico
  static  bool iguaisQ(Quadrado q1, Quadrado q2)
  {
   return (q1.lado == q2.lado);
  }

  // Método do Objeto  - Não Estatico
  bool iguais(Quadrado q2)
  {
   return (lado == q2.lado);
  }
};

C#

Classe #1

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DesenvolvimentoAberto
 {
     class Program
     {
         static void Main(string[] args)
         {

           // Instancia dos Objetos
           Quadrado q1 = new Quadrado(32);
           Quadrado q2 = new Quadrado(32);
           Console.WriteLine("Verifica se os Objetos são iguais\n");

          // Usa método da Classe
          Console.Write("Testa método da classe:");
          Console.WriteLine(Quadrado.iguaisQ(q1, q2));

          // Usa método do Objeto
          Console.Write("Testa método do objeto:");
          Console.WriteLine(q1.iguais(q2));
          Console.ReadKey();
         }
     }
 }

Classe #2

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DesenvolvimentoAberto
 {
     class Quadrado
     {
       private double lado;

             public Quadrado(double lado)
             {
                 this.lado = lado;
             }

             // Método da Classe - Estatico
             static public Boolean iguaisQ(Quadrado q1, Quadrado q2)
             {
                 return (q1.lado == q2.lado);
             }

             // Método do Objeto  - Não Estatico
             public Boolean iguais(Quadrado q2)
             {
                 return (lado == q2.lado);
             }
    }
 }

Python

Classe #1

#!/usr/bin/env python
# -*- coding: latin-1 -*-
# Desenvolvimento Aberto
# objetos_metodos.py
class Q:
     lado = 0
class Quadrado(Q) :
     def __init__(self, lado = 0):
         self.lado = lado

     def iguais(self,q2 = Q()):
         return self.lado == q2.lado

     @staticmethod
     def iguaisQ(q1 = Q() , q2 = Q()):
         return q1.lado == q2.lado

# Instancia dos Objetos
q1 = Quadrado(32)
q2 = Quadrado(32)

print "Verifica se os Objetos são iguais\n"

# Usa método da Classe
print "Testa método da classe:"
print Quadrado.iguaisQ(q1, q2)

# Usa método do Objeto
print "Testa método do objeto:"
print q1.iguais(q2)

raw_input()

Abap

Classe #1

*&---------------------------------------------------------------------*
*& Report  ZMETODOS
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Metodos Estaticos e de Objetos
*&---------------------------------------------------------------------*

REPORT  ZMETODOS.

class Quadrado DEFINITION.

PUBLIC SECTION.

DATA lado TYPE i.

METHODS:

  CONSTRUCTOR IMPORTING lado TYPE i,

  IGUAIS IMPORTING Q2 TYPE REF TO QUADRADO
         RETURNING VALUE(resultado) TYPE ABAP_BOOL.

CLASS-METHODS

  IGUAISQ IMPORTING  Q1 TYPE REF TO QUADRADO
                     Q2 TYPE REF TO QUADRADO
          RETURNING VALUE(resultado) TYPE ABAP_BOOL.

ENDCLASS.

CLASS QUADRADO IMPLEMENTATION.

  METHOD CONSTRUCTOR.
    CALL METHOD SUPER->CONSTRUCTOR.
    me->LADO = LADO.
  ENDMETHOD.

  METHOD IGUAIS.
    IF me->LADO EQ  Q2->LADO.
      RESULTADO = ABAP_TRUE.
    ELSE.
      RESULTADO = ABAP_FALSE.
    ENDIF.
  ENDMETHOD.

  METHOD IGUAISQ.
    IF Q1->LADO EQ  q2->LADO.
      RESULTADO = ABAP_TRUE.
    ELSE.
      RESULTADO = ABAP_FALSE.
    ENDIF.
  ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

DATA Q1 TYPE REF TO QUADRADO.
DATA Q2 TYPE REF TO QUADRADO.
DATA RT TYPE ABAP_BOOL.

CREATE OBJECT Q1 EXPORTING LADO = 32.
CREATE OBJECT Q2 EXPORTING LADO = 32.

WRITE : / 'Verifica se os Objetos são iguais'.

* Usa método da Classe

WRITE: / 'Testa método da classe:'.

QUADRADO=>IGUAISQ( exporting Q1 = Q1 Q2 = Q2 receiving RESULTADO = RT ).
PERFORM RESULTADO USING RT.

* Usa método do Objeto

WRITE : / 'Testa método do objeto:'.

RT = Q1->IGUAIS( Q2 ).
PERFORM RESULTADO USING RT.

FORM RESULTADO USING VALUE(R) TYPE ABAP_BOOL.
  IF R = ABAP_TRUE.
    WRITE :  'TRUE'.
  ELSE.
    WRITE :  'FALSE'.
  ENDIF.
ENDFORM.

Matriz – Java, C++ e C#

Publicado: 3 de março de 2014 em C#, C/C++, Java

Sim, está é a famosa palavra que traduzida para a língua inglesa da nome ao famoso filme Matrix onde as maquinas tomam conta do planeta terra escravizando a raça humana e a usando como fonte de energia. Mas ficção cientifica a parte, fica a pergunta,  o que é matriz?

Sinônimos de útero e mãe, na ciência da computação as matrizes são estruturas matemáticas organizadas na forma de tabela com linhas e colunas, utilizadas na organização de dados e informações. Nos assuntos ligados à álgebra, as matrizes são responsáveis pela solução de sistemas lineares.

Em C++ para utilizar matrizes dentro de classes é necessário alguns detalhes extras, o compilador Microsoft não permite inicializar arrays ou matrizes em uma classe fora do construtor, também possui regras sobre a ordem da declaração da matriz dentro da classe e requer a adição do parâmetro /c na hora da compilação. Para saber mais sobre o assunto use o link abaixo:

Compiler Error C2536: http://msdn.microsoft.com/en-us/library/9f53ks1w.aspx

Como C++ é uma linguagem hibrida e de paradigmas não é necessário utilizar objetos de classe e um código menor consegue obter um programa com o mesmo resultado que em Java e C#.

Exemplos:

Neste exemplo criaremos uma classe que contém uma matriz com as cartas do baralho. Em C++ teremos dois exemplos diferentes, o primeiro sem objetos de classe e o segundo com objetos de classe, mas não utilizando os requisitos da Microsoft.

Java

Classe #1 – Jogo

public class Jogo
 {

public static void main(String[] args)
{
  Cartas jogador1 =  new Cartas();

  // Cartas Disponiveis
  System.out.println("Naipes da Matriz");

  for (int naipes = 0; naipes <= jogador1.tNaipe()-1; naipes++ )
  {
    jogador1.jogaCartas(0, naipes);
  }

  System.out.println();
  System.out.println();
  System.out.println("Componentes da Matriz");

  for (int componentes = 0; componentes <= jogador1.tComponentes()-1; componentes++ )
  {
     jogador1.jogaCartas(1, componentes);
  }

  }
}

Classe #2 -Cartas

public class Cartas
{
private int naipe;
private int componetes;

private String cartas[][] =
{
{ "Paus",  "Ouros",  "Copas",  "Espadas", },
{ "Curinga", "As", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Valete", "Dama", "Rei" }

};

Cartas ()
{ }

Cartas (int naipe, int componentes)
{
this.naipe = naipe;
this.componetes = componentes;
}

public void jogaCartas(int naipe, int componentes)
{
System.out.print(cartas[naipe][componentes] + ", ");
}

public int tNaipe()
{
return this.cartas[0].length;
}

public int tComponentes ()
{
return this.cartas[1].length;
}
}

C#

Classe #1 – Jogo

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DesenvolvimentoAberto
 {
     class Program
     {
       static void Main(string[] args)
      {
       Cartas jogador1 =  new Cartas();

      // Cartas Disponiveis
      Console.WriteLine("Naipes da Matriz");

      for (int naipes = 0; naipes <= jogador1.tNaipe()-1; naipes++ )
      {
          jogador1.jogaCartas(0, naipes);
      }

      Console.WriteLine();

      Console.WriteLine();
      Console.WriteLine("Componentes da Matriz");

     for (int componentes = 0; componentes <= jogador1.tComponentes()-1; componentes++ )
      {
          jogador1.jogaCartas(1, componentes);
      }

      Console.ReadKey();
      }
    }
 }

Classe #2 -Cartas

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DesenvolvimentoAberto
 {
     public class Cartas
     {
      private int naipe;
      private int componetes;

         private string[][] cartas =
         {
             new string[]
             { "Paus",  "Ouros",  "Copas",  "Espadas", },

             new string[]

             { "Curinga", "As", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Valete", "Dama", "Rei" }
                                           };
      public Cartas ()
      { }

      public Cartas (int naipe, int componentes)
      {
       this.naipe = naipe;
       this.componetes = componentes;
      }

      public void jogaCartas(int naipe, int componentes)
      {
         Console.Write(cartas[naipe][componentes] + ", ");
      }

      public int tNaipe()
      {
         return this.cartas[0].Length;
      }

      public int tComponentes ()
      {
       return this.cartas[1].Length;
      }
   }
 }

C++

Arquivo #1:

#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

 const int tnaipe = 4;
 const int tcompo = 14;

const string cartas[tnaipe][tcompo] =
 {
  { "Paus", "Ouros", "Copas", "Espadas", },

  { "Curinga", "As", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Valete", "Dama", "Rei" }
 };

 void jogaCartas(int naipe, int componentes)
 {
  cout << cartas[naipe][componentes] << ", ";
 }

 int _tmain(int argc, _TCHAR* argv[])
 {

// Cartas Disponíveis

  cout << "Naipes da Matriz" << endl;

  for (int naipes = 0; naipes <= tnaipe - 1; naipes++)
  {
   jogaCartas(0, naipes);
  }

  cout << endl;  cout << endl;
  cout << "Componentes da Matriz" << endl;

  for (int componentes = 0; componentes <= tcompo - 1; componentes++)
  {
   jogaCartas(1, componentes);
  }

  cout << endl;  system("pause");
  return 0;
 }

C++ – exemplo 2

Arquivo #1 – Jogo

#include "stdafx.h"
#include <iostream>
#include <string>
#include "cartas.h"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
 {
  Cartas jogador1;

  cout << "Naipes da Matriz" << endl;

  for (int naipes = 0; naipes <= jogador1.tNaipe() - 1; naipes++)
  {
   jogador1.jogaCartas(0, naipes);
  }

  cout << endl;  cout << endl;
  cout << "Componentes da Matriz" << endl;

  for (int componentes = 0; componentes <= jogador1.tComponentes() - 1; componentes++)
  {
   jogador1.jogaCartas(1, componentes);
  }

  cout << endl;
  system("pause");

  return 0;
 }

Arquivo #2 – Classe Cartas (.h)

#include "stdafx.h"
#include <iostream>
#include <string>
#include "da_matriz.h"
using namespace std;

class Cartas
 {
 public:

  void jogaCartas(int naipe, int componentes)
  {
   cout << cartas[naipe][componentes] << ", " ;
  }

  int tNaipe()
  {
   return tnaipe;
  }

  int tComponentes()
  {
   return tcompo ;
  }

};

Arquivo #3 – da matriz  (.h)

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

const int tnaipe = 4;
const int tcompo = 14;

const string cartas[tnaipe][tcompo] =
 {
  { "Paus", "Ouros", "Copas", "Espadas", },

  { "Curinga", "As", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Valete", "Dama", "Rei" }
 };

Método de sobrecarga é uma característica encontrada em várias linguagens de programação, que permite a criação de vários métodos com o mesmo nome, que diferem uns dos outros no tipo da entrada e a saída da função. É simplesmente definido como a capacidade de uma função para executar diferentes tarefas.

Construtores, são usados ​​para criar instâncias de um objeto, também podem ser sobrecarregados em algumas linguagens de programação orientadas a objeto. Porque em muitas línguas o nome do construtor é pré-determinado pelo nome da classe. Sempre que são necessários vários construtores são implementados como funções sobrecarregadas. Um construtor padrão não tem parâmetros, instanciam os membros do objeto com um valor zero.

Ter pelo menos dois construtores é quase obrigatório em programação orientada a objeto, o construtor default facilita criar métodos Modifiers e Fill-in, pois é possível manipular objetos sem ter que passar nenhum parâmetros para eles e trabalhar com seus atributos dentro dos métodos, enquanto ao mesmo tempo é pratico criar objetos com valores inicializados, sem ter que escrever varias linhas.

Em Java, C++ e C# sobrecarregar um construtor  é simples, basta apenas criar quantos construtores forem necessários, por outro lado linguagens hibridas como Abap e Python (C++ também é uma linguagem hibrida, mas é muito poderosa) não é possível  sobrecarregar o método construtor, mas como este é um recurso extremamente útil, existe um modo de criar o mesmo efeito de sobrecarga nos construtores.

Abap possui a palavra chave OPTIONAL, na qual marca o parâmetro como opcional, deste modo é possível criar um objeto que simula o construtor Overload.

Python é uma linguagem moderna e bem flexível em sua sintaxe e possibilita inicializar o construtor atribuindo valores a variável e podemos usar a palavra chave None para dizer que o conteúdo é vazio, simulando deste modo um construtor Overload.

Exemplo:

Neste exemplo criamos dois construtores : o construtor default e um construtor Overload, para as linguagens Java, C++ e C# e para as  linguagens Abap e Python usamos um recurso da língua para simular o construtor Overload obtendo o mesmo efeito.

Java

public class Sobrecarga
  {
     int x = 0;
     int y = 0;

     public Sobrecarga () {}

     public Sobrecarga(int x, int y)
   {
     this.x = x;
     this.y = y;
   }

   public  void imprimeSb()
   {
     System.out.println("X=" + this.x + " Y=" + this.y);
   }

   public static void main(String[] args)
   {
       Sobrecarga sc1 = new Sobrecarga();
       Sobrecarga sc2 = new Sobrecarga(10,20);
       System.out.println("Construtor Default");
       sc1.imprimeSb();
       System.out.println("Construtor Overload");
       sc2.imprimeSb();
  }
 }

C++

#include "stdafx.h"
#include <iostream>

using namespace std;

class Sobrecarga
  {
  public:
   int x = 0;
   int y = 0;

   Sobrecarga( )   {   }

   Sobrecarga(int x, int y)
   {
    this->x = x;
    this->y = y;
   }

  void imprimeSb()
   {
    cout << "X=" << this->x << " Y=" << this->y << endl;
   }
};

int _tmain(int argc, _TCHAR* argv[])
  {
   Sobrecarga sc1;  Sobrecarga sc2(10, 20);
   cout << "Construtor Default" << endl;
   sc1.imprimeSb();

   cout << "Construtor Overload" << endl;
   sc2.imprimeSb();
   system("pause");
   return 0;
  }

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesenvolvimentoAberto
  {
      class Sobrecarga
      {
          int x = 0;
          int y = 0;

         public Sobrecarga() { }

         public Sobrecarga(int x, int y)
          {
              this.x = x;
              this.y = y;
          }

      public void imprimeSb()
       {
         Console.WriteLine("X=" + this.x + " Y=" + this.y);
       }

          static void Main(string[] args)
          {
              Sobrecarga sc1 = new Sobrecarga();
              Sobrecarga sc2 = new Sobrecarga(10,20);
              Console.WriteLine("Construtor Default");
              sc1.imprimeSb();
              Console.WriteLine("Construtor Overload");
              sc2.imprimeSb();
              Console.ReadKey();
          }
      }
  }

Abap

*&---------------------------------------------------------------------*
*& Report  ZOBJETOS_OVER
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Construtor Overload
*&---------------------------------------------------------------------*

REPORT  ZOBJETOS_OVER.

* Declara Classe

Class SobreCarga DEFINITION.

PUBLIC SECTION.
   DATA X TYPE i.
    DATA Y TYPE i.

" Efeito Overload
METHODS:
CONSTRUCTOR IMPORTING
             X TYPE i OPTIONAL
             Y TYPE i OPTIONAL,
ImprimeSB.

ENDCLASS.

Class SOBRECARGA IMPLEMENTATION.

 METHOD CONSTRUCTOR.
     me->X = X.
     me->Y = Y.
 ENDMETHOD.

 METHOD ImprimeSB.
     WRITE: / 'X=', me->X, 'Y=', me->Y.
 ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

DATA SB1 TYPE REF TO SOBRECARGA.
DATA SB2 TYPE REF TO SOBRECARGA.

* Cria Objetos Construtor Default e Overload
CREATE OBJECT SB1.
CREATE OBJECT SB2 EXPORTING X = 10 Y = 20.

WRITE: / 'Construtor Default:'.
SB1->IMPRIMESB( ).
WRITE: / 'Construtor Overload:'.
SB2->IMPRIMESB( ).

Python

#!/usr/bin/env python
# -*- coding: latin-1 -*-
# Desenvolvimento Aberto
# sobrecarga.py

class SobreCarga:
      x = 0
      y = 0
      def __init__(Self,x= None, y = None):
          if (x is not None) and (y is not None):
              Self.x = x
              Self.y = y
      def ImprimeSb(Self):
          print "X=", Self.x, "Y=", Self.y

sc1 = SobreCarga();
sc2 = SobreCarga(10,20);
print "Construtor Default"
sc1.ImprimeSb();
print "Construtor Overload"
sc2.ImprimeSb();
raw_input()

Pure Function

Usa os objetos como argumentos, mas não os modifica. o valor de retorno é ou um primitivo ou um novo objeto criado dentro do método.

Um método é considerado uma função pura se o resultado depender apenas dos argumentos, e não ter efeitos colaterais, como modificar um argumento ou imprimir algo. O único resultado de chamar uma função pura é o seu valor de retorno.

Na transformação funcional pura, um conjunto de funções, chamadas funções puras, definem a forma de como transformar um conjunto de dados estruturados a partir de sua forma original para outra forma. A palavra “pura” indica que as funções são combináveis​​, que exige que elas sejam:

Auto-suficiente, de modo que elas podem ser livremente ordenada e rearranjada sem emaranhamento ou interdependências com o resto do programa. Transformações puras não têm conhecimento ou efeito sobre o meio ambiente. Ou seja, as funções utilizadas para a transformação não tem efeitos colaterais.

Sem mudança de estado, de modo que a execução da mesma função ou conjunto específico de funções na mesma entrada sempre resultará na mesma saída. Transformações puras não têm memória do seu uso anterior. Funções puras ajudar a gerenciar a complexidade dos grandes projetos.

Modifiers

Usa objetos como argumentos e modifica alguns elementos ou todos eles. Muitas vezes, retorna uma void. Um método modificador muda a forma como os objetos funcionam.

Fill-in

Um dos argumentos é um objeto vazio que é preenchido pelo método. Tecnicamente, este método também é um tipo de Modifier.

Melhores Praticas

É recomendado que você escreva funções puras sempre que for razoável, e recorra aos Modifiers e Fill-ins apenas se houver uma grande vantagem.

Métodos Modifiers e Fill-in  são eficientes porque eles não têm que criar novos objetos. Mas se torna mais difícil de isolar partes de um programa, e em grandes projetos podem causar erros que são difíceis de encontrar.

Em síntese estes conceitos passam a substituir a nomenclatura das funções e procedimentos das linguagens de programação procedural, por serem métodos integrantes de objetos e não mais procedimentos ou funções auto suficientes, porem ainda são estruturalmente iguais.

Exemplo:

Neste exemplo escrevemos três métodos diferentes: Pure function, Modifier e um fill-in, e manipulamos objetos utilizando estes métodos.

Java

Classe #1 – Principal

public class Metodos
 {

  // Método - Pure Function
  static boolean maxRet(Retangulo ret, int altura, int largura)
  {
     if ((ret.altura <= altura) && (ret.largura <= largura))
     {
         return true;
     }
   else
     {
        return false;
     }
  }

  // Método - Modifiers
  static void posicao(Retangulo ret, int x, int y)
  {
     ret.x = ret.x + x;
     ret.y = ret.y + y;
  }

  // Método - Fill-in
  static void modRet(Retangulo r1, Retangulo r2, Retangulo r3)
  {
     r1.x       =  r2.x      + r3.x;
     r1.y       =  r2.y      + r3.y;
     r1.altura  = r2.altura  + r3.altura;
     r1.largura = r2.largura + r3.largura;
  }

 public static void main(String[] args)
 {

   Retangulo ret1 = new Retangulo(50,50,200,300);
   Retangulo ret2 = new Retangulo(15,15,120,150);
   Retangulo ret3 = new Retangulo();
   ret1.imprimeRet();

   System.out.println("Retangulo está dentro do limite maximo:" + maxRet(ret1, 500, 600));
   System.out.println();
   System.out.println("Modifica posição do retangulo:");
   posicao(ret1, 20, 20);
   ret1.imprimeRet();

   System.out.println();
   System.out.println("Modifica tamanho do retangulo:");
   modRet(ret3, ret1, ret2);
   ret3.imprimeRet();
  }
}

Classe #2 – Retangulo

public class Retangulo
{
public int x;
public int y;
public int altura;
public int largura;

public Retangulo ()
{

}

public Retangulo (int x, int y, int altura, int largura)
{
  this.x       = x;
  this.y       = y;
  this.altura  = altura;
  this.largura = largura;
}

 public void imprimeRet()
 {
  System.out.println("X =" +  x +  " Y= " + y + " Altura="+ altura + " Largura=" + largura );
 }

}

C++

Classe #1 – Principal

include "stdafx.h"
#include <iostream>
#include <string>
#include "Retangulo.h"

static bool maxRet(Retangulo& ret, int altura, int largura)
{
  if ((ret.altura <= altura) && (ret.largura <= largura))
  {
     return true;
  }
  else
  {
     return false;
  }
}

 // Método - Modifiers
 static void posicao(Retangulo& ret, int x, int y)
 {
    ret.x = ret.x + x;  ret.y = ret.y + y;
 }

 // Método - Fill-in

 static void modRet(Retangulo& r1, Retangulo& r2, Retangulo& r3)
 {
    r1.x = r2.x + r3.x;
    r1.y = r2.y + r3.y;
    r1.altura = r2.altura + r3.altura;
    r1.largura = r2.largura + r3.largura;
 }

 int _tmain(int argc, _TCHAR* argv[])
 {
    Retangulo ret1 (50, 50, 200, 300);
    Retangulo ret2 (15, 15, 120, 150);
    Retangulo ret3 (0,0,0,0);
    ret1.imprimeRet();

    cout << "Retangulo está dentro do limite maximo:" << maxRet(ret1, 500, 600) << endl;

    cout << endl;
    cout << "Modifica posição do retangulo:" << endl;  posicao(ret1, 20, 20);
    ret1.imprimeRet();

    cout << endl;
    cout << "Modifica tamanho do retangulo:" << endl;  modRet(ret3, ret1, ret2);
    ret3.imprimeRet();

   system("pause");
   return 0;
 }

Classe #2 – Retangulo

#include "stdafx.h"
#include <iostream>

using namespace std;

class Retangulo
{
 public:

  int x;
  int y;
  int altura;
  int largura;

  Retangulo()
  {  }

  Retangulo(int x, int y, int altura, int largura)
  {
     this->x = x;
     this->y = y;
     this->altura = altura;
     this->largura = largura;
  }

  void imprimeRet()
  {
     cout << "X =" << x << " Y= " << y << " Altura=" << altura << " Largura=" << largura << endl;
  }

};

C#

Classe #1 – Principal

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesenvolvimentoAberto
 {
     class Program
     {
         // Método - Pure Function

         static Boolean maxRet(Retangulo ret, int altura, int largura)
         {
             if ((ret.altura <= altura) && (ret.largura <= largura))
             {
                 return true;
             }
             else
             {
                 return false;
             }
         }

         // Método - Modifiers
         static void posicao(Retangulo ret, int x, int y)
         {
             ret.x = ret.x + x;
             ret.y = ret.y + y;
         }

         // Método - Fill-in

         static void modRet(Retangulo r1, Retangulo r2, Retangulo r3)
         {
             r1.x = r2.x + r3.x;
             r1.y = r2.y + r3.y;
             r1.altura = r2.altura + r3.altura;
             r1.largura = r2.largura + r3.largura;
         }

         static void Main(string[] args)
         {
             Retangulo ret1 = new Retangulo(50,50,200,300);
             Retangulo ret2 = new Retangulo(15,15,120,150);
             Retangulo ret3 = new Retangulo();

             ret1.imprimeRet();
             Console.WriteLine("Retangulo está dentro do limite maximo:" + maxRet(ret1, 500, 600));
             Console.WriteLine();

            Console.WriteLine("Modifica posição do retangulo:");
            posicao(ret1, 20, 20);
            ret1.imprimeRet();

           Console.WriteLine();
           Console.WriteLine("Modifica tamanho do retangulo:");
           modRet(ret3, ret1, ret2);
           ret3.imprimeRet();

           Console.ReadKey();
       }
     }
 }

Classe #2 – Retangulo

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesenvolvimentoAberto
 {
     class Retangulo
     {
             public int x;
             public int y;
             public int altura;
             public int largura;

             public Retangulo()
             {
             }

             public Retangulo(int x, int y, int altura, int largura)
             {
                 this.x = x;
                 this.y = y;
                 this.altura = altura;
                 this.largura = largura;
             }

             public void imprimeRet()
             {
                 Console.WriteLine("X =" +  x +  " Y= " + y + " Altura="+ altura + " Largura=" + largura );
             }
     }
 }