Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Abstração | Princípios de POO
C# Além do Básico

bookAbstração

Abstração é um conceito fundamental na programação orientada a objetos (POO) que permite ocultar detalhes complexos de implementação e focar nas funcionalidades essenciais. Em C#, a abstração é alcançada por meio de classes abstratas.

Note
Nota

A POO foi inicialmente baseada em três princípios (às vezes chamados de "Os Três Pilares da POO"), incluindo Encapsulamento, Herança e Polimorfismo. Portanto, a Abstração é uma adição recente e, em algumas fontes, pode não ser considerada um conceito fundamental. No entanto, é um conceito importante.

Uma classe abstrata é uma classe que não pode ser instanciada, ou seja, não é possível criar um objeto dessa classe. Uma classe abstrata pode conter atributos e métodos como qualquer outra classe, porém também pode conter métodos abstratos, que são métodos modelo destinados a serem implementados pelas classes derivadas.

Você pode criar uma classe abstrata adicionando a palavra-chave abstract antes da definição da classe. Por exemplo, vamos criar uma classe abstrata chamada Shape:

index.cs

index.cs

copy
12345678910111213141516171819
using System; abstract class Shape { protected float circumference; public float getCircumference() { return circumference; } } class ConsoleApp { static void Main() { Shape s = new Shape(); // Error: Cannot create an instance of an abstract class } }

Da mesma forma, é possível criar um método abstrato adicionando a palavra-chave abstract antes do seu tipo de retorno. Um método abstrato não possui corpo - ele serve apenas como um modelo:

index.cs

index.cs

copy
1234567891011
abstract class Shape { protected float circumference; public float getCircumference() { return circumference; } public abstract float getArea(); }

O objetivo disso é criar um modelo para outras classes. Isso ajuda a simplificar o código. Para entender melhor, observe a tarefa de Polimorfismo do Capítulo 5:

index.cs

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
using System; class Shape { // Perimeter is the length of the 'outline' of a shape protected float perimeter; public float getPerimeter() { return perimeter; } public virtual float getArea() { return 0.0f; } // A virtual method can only be either 'public' or 'protected' protected virtual float calculatorPerimeter() { return 0.0f; } } class Rectangle : Shape { float width; float height; public Rectangle(float width, float height) { this.width = width; this.height = height; this.perimeter = getPerimeter(); } public override float getArea() { return width * height; } protected override float calculatorPerimeter() { return width * 2 + height * 2; } } class Square : Shape { float length; public Square(float length) { this.length = length * length; } public override float getArea() { return length * length; } protected override float calculatorPerimeter() { return 4 * length; } } class Circle : Shape { float radius; public Circle(float radius) { this.radius = radius; } // Area of a Circle = pi . r . r public override float getArea() { return 3.14f * radius * radius; } // Perimeter (or) Circumference: 2 . pi . r protected override float calculatorPerimeter() { return 2.00f * 3.14f * radius; } } class ConsoleApp { static void Main() { Rectangle r1 = new Rectangle(10f, 20f); Square s1 = new Square(10f); Circle c1 = new Circle(10f); Console.WriteLine(r1.getArea()); Console.WriteLine(s1.getArea()); Console.WriteLine(c1.getArea()); } }

No exemplo acima, não há intenção de utilizar a classe Shape, porém ainda foi necessário escrever algumas implementações fictícias dos métodos getArea e calculatePerimeter dentro da classe Shape. É possível simplificar esse código tornando a classe Shape abstrata; além disso, também é possível tornar os métodos getArea e calculatePerimeter abstratos.

Note
Nota

Um método pode ser abstrato ou virtual, mas não ambos ao mesmo tempo. No entanto, é importante observar que um método abstrato é basicamente um método virtual (passível de sobrescrita), mas não possui corpo na classe base.

index.cs

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
using System; using System.Collections.Generic; abstract class Shape { // Perimeter is the length of the 'outline' of a shape protected float perimeter; public float getPerimeter() { return perimeter; } public abstract float getArea(); protected abstract float calculatorPerimeter(); } class Rectangle : Shape { float width; float height; public Rectangle(float width, float height) { this.width = width; this.height = height; this.perimeter = getPerimeter(); } public override float getArea() { return width * height; } protected override float calculatorPerimeter() { return width * 2 + height * 2; } } class Square : Shape { float length; public Square(float length) { this.length = length * length; } public override float getArea() { return length * length; } protected override float calculatorPerimeter() { return 4 * length; } } class Circle : Shape { float radius; public Circle(float radius) { this.radius = radius; } public override float getArea() { return 3.14f * radius * radius; } protected override float calculatorPerimeter() { return 2.00f * 3.14f * radius; } } class ConsoleApp { static void Main() { Rectangle r1 = new Rectangle(10f, 20f); Square s1 = new Square(10f); Circle c1 = new Circle(10f); // We cannot create an instance of 'Shape' but we can use type datatype "Shape" for creating variables, arrays or lists List<Shape> shapes = new List<Shape>(); shapes.Add(r1); shapes.Add(s1); shapes.Add(c1); foreach(Shape shape in shapes) { Console.WriteLine(shape.getArea()); } } }

1. Qual palavra-chave é usada para tornar uma classe abstrata?

2. Uma classe abstrata pode ser instanciada?

question mark

Qual palavra-chave é usada para tornar uma classe abstrata?

Select the correct answer

question mark

Uma classe abstrata pode ser instanciada?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 5. Capítulo 8

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Awesome!

Completion rate improved to 2.04

bookAbstração

Deslize para mostrar o menu

Abstração é um conceito fundamental na programação orientada a objetos (POO) que permite ocultar detalhes complexos de implementação e focar nas funcionalidades essenciais. Em C#, a abstração é alcançada por meio de classes abstratas.

Note
Nota

A POO foi inicialmente baseada em três princípios (às vezes chamados de "Os Três Pilares da POO"), incluindo Encapsulamento, Herança e Polimorfismo. Portanto, a Abstração é uma adição recente e, em algumas fontes, pode não ser considerada um conceito fundamental. No entanto, é um conceito importante.

Uma classe abstrata é uma classe que não pode ser instanciada, ou seja, não é possível criar um objeto dessa classe. Uma classe abstrata pode conter atributos e métodos como qualquer outra classe, porém também pode conter métodos abstratos, que são métodos modelo destinados a serem implementados pelas classes derivadas.

Você pode criar uma classe abstrata adicionando a palavra-chave abstract antes da definição da classe. Por exemplo, vamos criar uma classe abstrata chamada Shape:

index.cs

index.cs

copy
12345678910111213141516171819
using System; abstract class Shape { protected float circumference; public float getCircumference() { return circumference; } } class ConsoleApp { static void Main() { Shape s = new Shape(); // Error: Cannot create an instance of an abstract class } }

Da mesma forma, é possível criar um método abstrato adicionando a palavra-chave abstract antes do seu tipo de retorno. Um método abstrato não possui corpo - ele serve apenas como um modelo:

index.cs

index.cs

copy
1234567891011
abstract class Shape { protected float circumference; public float getCircumference() { return circumference; } public abstract float getArea(); }

O objetivo disso é criar um modelo para outras classes. Isso ajuda a simplificar o código. Para entender melhor, observe a tarefa de Polimorfismo do Capítulo 5:

index.cs

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
using System; class Shape { // Perimeter is the length of the 'outline' of a shape protected float perimeter; public float getPerimeter() { return perimeter; } public virtual float getArea() { return 0.0f; } // A virtual method can only be either 'public' or 'protected' protected virtual float calculatorPerimeter() { return 0.0f; } } class Rectangle : Shape { float width; float height; public Rectangle(float width, float height) { this.width = width; this.height = height; this.perimeter = getPerimeter(); } public override float getArea() { return width * height; } protected override float calculatorPerimeter() { return width * 2 + height * 2; } } class Square : Shape { float length; public Square(float length) { this.length = length * length; } public override float getArea() { return length * length; } protected override float calculatorPerimeter() { return 4 * length; } } class Circle : Shape { float radius; public Circle(float radius) { this.radius = radius; } // Area of a Circle = pi . r . r public override float getArea() { return 3.14f * radius * radius; } // Perimeter (or) Circumference: 2 . pi . r protected override float calculatorPerimeter() { return 2.00f * 3.14f * radius; } } class ConsoleApp { static void Main() { Rectangle r1 = new Rectangle(10f, 20f); Square s1 = new Square(10f); Circle c1 = new Circle(10f); Console.WriteLine(r1.getArea()); Console.WriteLine(s1.getArea()); Console.WriteLine(c1.getArea()); } }

No exemplo acima, não há intenção de utilizar a classe Shape, porém ainda foi necessário escrever algumas implementações fictícias dos métodos getArea e calculatePerimeter dentro da classe Shape. É possível simplificar esse código tornando a classe Shape abstrata; além disso, também é possível tornar os métodos getArea e calculatePerimeter abstratos.

Note
Nota

Um método pode ser abstrato ou virtual, mas não ambos ao mesmo tempo. No entanto, é importante observar que um método abstrato é basicamente um método virtual (passível de sobrescrita), mas não possui corpo na classe base.

index.cs

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
using System; using System.Collections.Generic; abstract class Shape { // Perimeter is the length of the 'outline' of a shape protected float perimeter; public float getPerimeter() { return perimeter; } public abstract float getArea(); protected abstract float calculatorPerimeter(); } class Rectangle : Shape { float width; float height; public Rectangle(float width, float height) { this.width = width; this.height = height; this.perimeter = getPerimeter(); } public override float getArea() { return width * height; } protected override float calculatorPerimeter() { return width * 2 + height * 2; } } class Square : Shape { float length; public Square(float length) { this.length = length * length; } public override float getArea() { return length * length; } protected override float calculatorPerimeter() { return 4 * length; } } class Circle : Shape { float radius; public Circle(float radius) { this.radius = radius; } public override float getArea() { return 3.14f * radius * radius; } protected override float calculatorPerimeter() { return 2.00f * 3.14f * radius; } } class ConsoleApp { static void Main() { Rectangle r1 = new Rectangle(10f, 20f); Square s1 = new Square(10f); Circle c1 = new Circle(10f); // We cannot create an instance of 'Shape' but we can use type datatype "Shape" for creating variables, arrays or lists List<Shape> shapes = new List<Shape>(); shapes.Add(r1); shapes.Add(s1); shapes.Add(c1); foreach(Shape shape in shapes) { Console.WriteLine(shape.getArea()); } } }

1. Qual palavra-chave é usada para tornar uma classe abstrata?

2. Uma classe abstrata pode ser instanciada?

question mark

Qual palavra-chave é usada para tornar uma classe abstrata?

Select the correct answer

question mark

Uma classe abstrata pode ser instanciada?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 5. Capítulo 8
some-alt