Em C#, pode definir-se uma hierarquia de classes através da herança, que permite a uma classe derivada (Car) herdar o comportamento e os dados da sua classe base (Vehicle). Se não for especificada nenhuma classe base, a classe herda da classe object.
As classes base podem fornecer funcionalidade às classes derivadas de três formas:
virtual, que é como um método normal, mas que as classes derivadas podem alterar.abstract, que é um método sem implementação que as classes derivadas têm de implementar. Uma classe com métodos abstract também tem de ser marcada como abstract. As classes abstratas não podem ser instanciadas.O modificador de acesso protected permite aceder a um membro de uma classe base a partir de uma classe derivada, mas bloqueia o acesso a partir de outras classes.
As classes derivadas podem aceder aos membros da classe base através da palavra-chave base.
// Inherits from the 'object' class
abstract class Vehicle
{
// Can be overridden
public virtual void Drive()
{
}
// Must be overridden
protected abstract int Speed();
}
class Car : Vehicle
{
public override void Drive()
{
// Override virtual method
// Call parent implementation
base.Drive();
}
protected override int Speed()
{
// Implement abstract method
}
}
O construtor de uma classe derivada vai chamar automaticamente o construtor da classe base antes de executar a lógica do seu próprio construtor. Podem passar-se argumentos ao construtor de uma classe base através da palavra-chave base:
abstract class Vehicle
{
protected Vehicle(int wheels)
{
Console.WriteLine("Called first");
}
}
class Car : Vehicle
{
public Car() : base(4)
{
Console.WriteLine("Called second");
}
}
Quando mais do que uma classe deriva de uma classe base, as duas (ou mais) classes implementam frequentemente versões diferentes de um método da classe base. Este é um princípio muito importante chamado polimorfismo. Por exemplo, numa variação do exemplo acima, mostramos como o código que usa Vehicle pode alterar o seu comportamento consoante o tipo de veículo que foi instanciado.
abstract class Vehicle
{
public abstract string GetDescription();
}
class Car : Vehicle
{
public Car()
{
}
public override string GetDescription()
{
return "Runabout";
}
}
class Rig : Vehicle
{
public Rig()
{
}
public override string GetDescription()
{
return "Big Rig";
}
}
Vehicle v1 = new Car();
Vehicle v2 = new Rig();
v1.GetDescription();
// => Runabout
v2.GetDescription();
// => Big Rig
Neste exercício vais jogar um jogo de interpretação de papéis chamado "Wizard and Warriors", que te permite jogar como Wizard ou como Warrior.
As regras para determinar quantos pontos de dano causam são diferentes para Warriors e Wizards.
Para um Warrior, as regras são as seguintes:
Para um Wizard, as regras são as seguintes:
Em geral, as personagens nunca são vulneráveis. No entanto, os Wizards são vulneráveis se não tiverem preparado um feitiço.
Tens seis tarefas que trabalham com personagens Warrior e Wizard.
Substitui o método ToString() da classe Character para devolver uma descrição da personagem, formatada como "Character is a <CHARACTER_TYPE>".
var warrior = new Warrior();
warrior.ToString();
// => "Character is a Warrior"
Garante que o método Character.Vulnerable() devolve sempre false.
var warrior = new Warrior();
warrior.Vulnerable();
// => false
Implementa o método Wizard.PrepareSpell() para permitir que um Wizard prepare um feitiço com antecedência.
var wizard = new Wizard();
wizard.PrepareSpell();
Garante que o método Vulnerable() devolve true se o Wizard não tiver preparado um feitiço; caso contrário, devolve false.
var wizard = new Wizard();
wizard.Vulnerable();
// => true
Implementa o método Wizard.DamagePoints() para devolver os pontos de dano causados: 12 pontos de dano quando um feitiço tiver sido preparado, 3 pontos de dano quando não.
var wizard = new Wizard();
var warrior = new Warrior();
wizard.PrepareSpell();
wizard.DamagePoints(warrior);
// => 12
Implementa o método Warrior.DamagePoints() para devolver os pontos de dano causados: 10 pontos de dano quando o alvo é vulnerável, 6 pontos de dano quando não.
var warrior = new Warrior();
var wizard = new Wizard();
warrior.DamagePoints(wizard);
// => 10
Inscreve-te no Exercism para aprenderes e dominares C# com 62 conceitos178 exercícios, e mentoria humana real, tudo grátis.