Em C#, uma hierarquia de classes pode ser definida usando herança, que permite que uma classe derivada (Car) herde o comportamento e os dados da sua classe pai (Vehicle). Se nenhum pai for especificado, a classe herda da classe object.
As classes pai podem fornecer funcionalidade às classes derivadas de três formas:
virtual, que é como um método comum, mas que as classes derivadas podem alterar.abstract, que é um método sem implementação que as classes derivadas precisam implementar. Uma classe com métodos abstract também precisa ser marcada como abstract. Classes abstratas não podem ser instanciadas.O modificador de acesso protected permite que um membro da classe pai seja acessado em uma classe derivada, mas bloqueia o acesso a partir de outras classes.
As classes derivadas podem acessar membros da classe pai por meio 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 chama automaticamente o construtor da classe pai antes de executar a lógica do próprio construtor. É possível passar argumentos para o construtor de uma classe pai usando a 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 de uma classe deriva de uma classe base, essas duas (ou mais) classes costumam implementar versões diferentes de um método da classe base. Esse é um princípio muito importante chamado polimorfismo. Por exemplo, em uma variação do exemplo acima, mostramos como um código que usa Vehicle pode mudar de comportamento dependendo do 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, você joga um jogo de RPG chamado "Wizard and Warriors", no qual pode jogar como um Wizard ou um Warrior.
Existem regras diferentes para Warriors e Wizards que determinam quantos pontos de dano eles causam.
Para um Warrior, as regras são:
Para um Wizard, as regras são:
Em geral, os personagens nunca são vulneráveis. No entanto, os Wizards são vulneráveis se não tiverem preparado uma magia.
Você tem seis tarefas que trabalham com personagens Warrior e Wizard.
Sobrescreva o método ToString() da classe Character para retornar uma descrição do personagem, formatada como "Character is a <CHARACTER_TYPE>".
var warrior = new Warrior();
warrior.ToString();
// => "Character is a Warrior"
Garanta que o método Character.Vulnerable() sempre retorne false.
var warrior = new Warrior();
warrior.Vulnerable();
// => false
Implemente o método Wizard.PrepareSpell() para permitir que um Wizard prepare uma magia com antecedência.
var wizard = new Wizard();
wizard.PrepareSpell();
Garanta que o método Vulnerable() retorne true se o wizard não tiver preparado uma magia; caso contrário, retorne false.
var wizard = new Wizard();
wizard.Vulnerable();
// => true
Implemente o método Wizard.DamagePoints() para retornar os pontos de dano causados: 12 pontos de dano quando uma magia tiver sido preparada, 3 pontos de dano quando não.
var wizard = new Wizard();
var warrior = new Warrior();
wizard.PrepareSpell();
wizard.DamagePoints(warrior);
// => 12
Implemente o método Warrior.DamagePoints() para retornar os pontos de dano causados: 10 pontos de dano quando o alvo for vulnerável, 6 pontos de dano quando não.
var warrior = new Warrior();
var wizard = new Wizard();
warrior.DamagePoints(wizard);
// => 10
Crie sua conta no Exercism para aprender e dominar C# com 62 conceitos178 exercícios e mentoria humana de verdade, tudo de graça.