Abstraçã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.
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
12345678910111213141516171819using 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
1234567891011abstract 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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102using 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.
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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100using 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?
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Awesome!
Completion rate improved to 2.04
Abstraçã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.
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
12345678910111213141516171819using 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
1234567891011abstract 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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102using 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.
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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100using 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?
Obrigado pelo seu feedback!