Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

dri.foruns

[Resolvido] Erro ao Realizar CAST e OVERRIDE ...

Recommended Posts

using System;

namespace Base{
	class Calculo1{

		public virtual double calculo(){
		return (10 * 5);
			}
	}
	class Calculo2:Calculo1{

	   public override double calculo(){ 
	   return (10*10);	 
		}

		public double multiplicacao()
		{
			return (2 * 6);

		}
	
		static void Main(string[] args){
				
				// CAST para realizar a chamada ao método Multiplicação somente assinado na SUB-Classe.
				Calculo1 a = new Calculo1();
				Calculo2 b = (Calculo2)a;
				Console.WriteLine(b.multiplicacao());

				//Chamada ao Método assinado como Virtual e que será sobrescrito pelo metodo calculo() da subclasse.

				Console.WriteLine(a.calculo());

		   Console.ReadLine();

		}
	}
}

 

Sou Iniciante em C#, inicialmente dois pontos me causam dúvida, no exemplo acima o método multiplicacao() somente está assinado na SUB-CLASSE então realizei o Cast para acessa-ló, mas um erro é apresentado: Unable to cast object of type 'Base.Calculo1' to type 'Base.Calculo2' e não consigo referênciar o método multiplicação(). O Outro ponto é em relação ao OVERRIDE, assinei meu método calculo() como override na Classe-Filha e o método que vai ser sobreescrito na Classe -Base como virtual, mas o resultado retornado é sempre 50 e não 100 que é o valor de retorno do método que irá sobrescrever o método virtual.

 

Espero que alguêm possa me ajudar.

Desde já agradeço...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Todo Calculo2 é um Calculo1, o contrário não está correto. Então você não pode transformar um Calculo1 em Calculo2, que é o cast que você está tentando fazer.

Console.WriteLine(a.calculo()); está retornando 50 porque a é do tipo Calculo1, se fosse do tipo Calculo2, você conseguiria.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Inicialmente gostaria de agradecer por ter respondido,

 

 

1)Mas alguns pontos ainda não estão claros para mim, por exemplo: Pelo que sei se eu tenho um método assinado numa subclasse e não assinado numa superclasse eu tenho que realizar um cast pra chamar o respectivo método, foi o que eu tentei fazer no bloco de codigo abaixo:

 

Calculo2 a = new Calculo2();

Calculo1 b = (Calculo1)a;

Console.WriteLine(b.multiplicacao());

 

Nesse caso pelo que entendi por sua explicação eu estaria transformando um objeto calculo2 em calculo1, mas qual a forma correta de realizar o cast para chamar um metodo somente assinado na subclasse ??

 

poderia simplesmente chamar o metodo somente pertencente a subclasse dessa forma abaixo ???

 

Calculo2 a=new Calculo2();

Console.WriteLine(a.multiplicacao);

 

2) E para chamar o método que foi subscrito usei "Console.WriteLine(a.calculo());" justamente porque pensei que por usar ''virtual'' no metodo que seria subscrito na SuperClasse o metodo calculo da subclasse iria se sobrepor e trazer o resultado 100.Mas qual a forma mais adequada de chamar esse método e me trazer valor 100 e nao 50.

 

Desde já agradeço...

Compartilhar este post


Link para o post
Compartilhar em outros sites

1) Sim, exatamente isso. Para chamar o método da subclass, você precisa instanciar ela. Esse exemplo do Calculo1/Calculo2 está meio confuso. Tente fazer uma estrutura assim:

-Automovel (Superclasse)

--Carro (subclasse de automovel)

--Moto (subclasse de automovel)

Você pode criar um método virtual chamado QuantosKmPorLitro. Tanto a Moto quanto o Carro tem essa funcionalidade de saber quantos km o automovel faz por litro, mas cada um deles faz um cálculo diferente para chegar no valor. O que você tentou fazer foi isso:

 

Automovel a = new Automovel();
Carro b = (Carro)a;
Console.WriteLine(b.QuantosKmPorLitro());

Analisando o código acima, quem te garante que o automovel "a" é um carro? Você não sabe, ele é um automóvel, se é um carro ou uma moto você não sabe.

 

Agora um exemplo funcional seria:

Automovel a = new Carro();
Console.WriteLine(a.QuantosKmPorLitro());

A chamada do método QuantosKmPorLitro nesse caso, vai chamar o método do Carro e não do Automóvel.

 

Espero que tenha ajudado, e não confundido :)

Dúvidas estamos ai!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Concerteza ajudou bastante,

 

1) Eu pensei que OBRIGATORIAMENTE eu deveria realizar uma Conversão explícita de objetos(Cast) para acessar um método somente assinado em uma subclasse, consigo entender de uma forma mais clara...mas construi aquele exemplo citado (Superclasse:Automovel,SubClasse:Carro e Subclasse:Moto), mas erros foram apresentados:

 

using System;

namespace cast_program{

	class Automovel{

		public const double valor_litro_gasolina = 2.00;

	}
	class Carro : Automovel
	{

		public virtual double QuantosKmPorLitro()
		{
			return (5 * valor_litro_gasolina);
		}
	}

	class Moto : Automovel
	{

		public override double QuantosKmPorLitro()
		{

			return ((10 * valor_litro_gasolina) * 2);
		}


		static void Main(string[] args)
		{

		   Automovel a = new Carro();

			Console.WriteLine("Valor Gasto pelo Carro:{0}",a.QuantosKmPorLitro());

			Console.ReadLine();

		}
	}

}

ERRO1:'cast_program.Moto.QuantosKMPorLitro()': no suitable method found to override.

 

ERRO2: 'cast_program.Automovel' does not contain a definition for 'QuantosKmPorLitro' and no extension method 'QuantosKMPorLitro' accepting a first argument of type 'cast_program.Automovel' could be found(are missing a using directive or an assembly reference?).

 

Se em " Console.WriteLine("Valor Gasto pelo Carro:{0}",a.QuantosKmPorLitro());" eu faço referencia a um método pertencente a Carro(), pq esses erros ?

 

 

2) Existe alguma situação prática em que eu possa utilizar o objeto 'b' abaixo? ou essa conversão por definição está errada ? :

 

 

Automovel a=new Automovel():
		 Carro b= (Carro)a;

 

Novamente agradeço pelas respostas e pela paciência ...

Grato...

Compartilhar este post


Link para o post
Compartilhar em outros sites

1) Fiz assim:

abstract class Automovel
{
	public const double valor_litro_gasolina = 2.00;
	public abstract double QuantosKmPorLitro();
}
class Carro : Automovel
{
	public override double QuantosKmPorLitro()
	{
		return (5 * valor_litro_gasolina);
	}
}

class Moto : Automovel
{
	public override double QuantosKmPorLitro()
	{
		return ((10 * valor_litro_gasolina) * 2);
	}
}
class Program
{
	static void Main(string[] args)
	{
		Automovel a = new Carro();
		Console.WriteLine("Valor gasto pelo carro:{0}", a.QuantosKmPorLitro());
		Automovel b = new Moto();
		Console.WriteLine("Valor gasto pelo moto:{0}", b.QuantosKmPorLitro());
		Console.ReadLine();
	}
}

Note que marquei o Automovel como abstract, isso vai fazer com que eu não possa fazer isso:

Automovel a = new Automovel();
É algo abstrato, ele não existe, o que existe é suas implementações (Carro e Moto nesse caso).

Agora isso:

Automovel a = new Moto();
É possível.

 

2) Está errada. Se em algum momento você precisar fazer isso, é porque tem algum problema na sua lógica.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.