Why is this necessary?
-
Thanks Griff for the examples If you have this code: class Bird : Animal {} Bird eagle = new Eagle(); then saying animal = eagle; is like saying animal = animal as they both should have the same properties. Please correct me if I'm wrong I see what you mean by real world. A bit like saying circle = square Brian
public class Animal
{
public void Breathe() {}
}
public class Bird : Animal
{
public void FlapWings() {}
}
public class Eagle : Bird
{
public void DiveVeryQuicklyOntoOtherBird(Bird target) {}
}
...
Bird eagle = new Eagle();
Animal animal = eagle;That's completely legal because Eagle is derived from Bird, which derives from Animal: an Eagle is a Bird, which is an Animal. But ... it's legal to say these:
eagle.FlapWings();
eagle.Breathe();Because
eagle
is a variable containing aBird
instance (or an instance of a class derived fromBird
), so it has all the properties and methods of aBird
as well as those of anAnimal
But ... you can't do this:eagle.DiveVeryQuicklyOntoOtherBird(myPigeon);
Because not all the types that can be held in a
Bird
variable areEagle
s; they could be anyBird
- so they don't all support theDiveVeryQuicklyOntoOtherBird
method - despite the variable currently containing an instance of anEagle
the system doesn't "know" that it always will; at a later point you could replace it witheagle = new Sparrow();
which can't dive really quickly like an apex predator! To use the method you'd need to cast the instance:
((Eagle)eagle).DiveVeryQuicklyOntoOtherBird(new Sparrow());
Or use an Eagle variable. If you try to cast a Sparrow to an Eagle, you will get an error at run time, because that's the only time when it can check if the conversion is possible.
Sent from my Amstrad PC 1640 Never throw anything away, Griff Bad command or file name. Bad, bad command! Sit! Stay! Staaaay... AntiTwitter: @DalekDave is now a follower!
-
But they are going to read about it in books any way. If it makes coding easier then I'm for it. I can learn the more later. Brian
-
Brian_TheLion wrote:
I can learn the more later.
Learning things in the wrong order is a sure way to failure.
Yes that is true but it's good to know that 'var' exists. I find that I'm best at learning programming by studying medium sized programs. I like to step thru a program to see how it works. I also try to write a simple C# program from what I have learnt. I suspect the biggest thing that turns beginners away from learning C# is when their program is fulled with errors and they have no idea on how to fix the problem or where they went wrong as they have tried to build a complex program before fully learning C#. Jumping in the deep end as they say. Things like l1.addExit(new Exit(Exit.Directions.North, l2)); takes a bit of getting use to but I'm keen to learn and are starting to understand it more. Brian
-
Now I've had some coffee, I'll add some thoughts for you. If you allowed
fox = new animal();
without the type specifier, what problems might it cause? Well, consider this:
public animal fox { get; set; }
public void DoSummat(animal a)
{
fox = a;
...
}Is the
fox
assignment insideDoSummat
meant to create a new local instance which is scoped to just the method, or to affect the public property? How could you tell? How could I tell when I tried to fix a problem in 100,000 lines of code next year? Worse, isfox
supposed to be ananimal
, or amammal
, or aCanidae
? Does it make a difference? Yes - it does. Becausebird
is a type ofanimal
but afox
doesn't have aFlapWings
method! So if you allow implicit typing, then the compiler has to assume the lowest common type in the hierarchy and that could mean that methods you expect to work just don't exist for that actual instance. And consider this:public void DoSummat(animal a)
{
fox = a;
...
fax = b;
...
}Is
fax
a new variable, or did I mistypefox
? How would you tell? C# is a strongly typed language: which means that there is no implicit declarations, no automatic type changing (except where data won't be lost such asint
todouble
for example), and heavy duty type checking - which makes your code more robust because it finds problems at compile time, instead of hoping you tested all the possible routes through the code and didn't leave a "bad type" in there.Sent from my Amstrad PC 1640 Never throw anything away, Griff Bad command or file name. Bad, bad command! Sit! Stay! Staaaay... AntiTwitter: @DalekDave is now a follower!
Some good caffeine in there ! :omg:
«Where is the Life we have lost in living? Where is the wisdom we have lost in knowledge? Where is the knowledge we have lost in information?» T. S. Elliot
-
Yes that is true but it's good to know that 'var' exists. I find that I'm best at learning programming by studying medium sized programs. I like to step thru a program to see how it works. I also try to write a simple C# program from what I have learnt. I suspect the biggest thing that turns beginners away from learning C# is when their program is fulled with errors and they have no idea on how to fix the problem or where they went wrong as they have tried to build a complex program before fully learning C#. Jumping in the deep end as they say. Things like l1.addExit(new Exit(Exit.Directions.North, l2)); takes a bit of getting use to but I'm keen to learn and are starting to understand it more. Brian
Brian_TheLion wrote:
I suspect the biggest thing that turns beginners away from learning C# is when their program is fulled with errors
When I see a student whose code is full of errors (beyond typos), I see a student who is not being guided properly, or, a student who is "flailing" because they have not grounded themselves in language basics, or don't know how to study in a disciplined way. Once you make some progress in getting over the initial learning curve with C#, I predict you will look back on VB and Python as the messes they are :)
«Where is the Life we have lost in living? Where is the wisdom we have lost in knowledge? Where is the knowledge we have lost in information?» T. S. Elliot
-
public class Animal
{
public void Breathe() {}
}
public class Bird : Animal
{
public void FlapWings() {}
}
public class Eagle : Bird
{
public void DiveVeryQuicklyOntoOtherBird(Bird target) {}
}
...
Bird eagle = new Eagle();
Animal animal = eagle;That's completely legal because Eagle is derived from Bird, which derives from Animal: an Eagle is a Bird, which is an Animal. But ... it's legal to say these:
eagle.FlapWings();
eagle.Breathe();Because
eagle
is a variable containing aBird
instance (or an instance of a class derived fromBird
), so it has all the properties and methods of aBird
as well as those of anAnimal
But ... you can't do this:eagle.DiveVeryQuicklyOntoOtherBird(myPigeon);
Because not all the types that can be held in a
Bird
variable areEagle
s; they could be anyBird
- so they don't all support theDiveVeryQuicklyOntoOtherBird
method - despite the variable currently containing an instance of anEagle
the system doesn't "know" that it always will; at a later point you could replace it witheagle = new Sparrow();
which can't dive really quickly like an apex predator! To use the method you'd need to cast the instance:
((Eagle)eagle).DiveVeryQuicklyOntoOtherBird(new Sparrow());
Or use an Eagle variable. If you try to cast a Sparrow to an Eagle, you will get an error at run time, because that's the only time when it can check if the conversion is possible.
Sent from my Amstrad PC 1640 Never throw anything away, Griff Bad command or file name. Bad, bad command! Sit! Stay! Staaaay... AntiTwitter: @DalekDave is now a follower!
Thanks Griff. I liked examples like these you've given me. You wrote:: eagle = new Sparrow() I thought you may have to use: Bird eagle = new Sparrow() . Is it because you have already defined the eagle as a bird (Bird eagle = new Eagle();) that you don't need to do this? Brian
-
Brian_TheLion wrote:
I suspect the biggest thing that turns beginners away from learning C# is when their program is fulled with errors
When I see a student whose code is full of errors (beyond typos), I see a student who is not being guided properly, or, a student who is "flailing" because they have not grounded themselves in language basics, or don't know how to study in a disciplined way. Once you make some progress in getting over the initial learning curve with C#, I predict you will look back on VB and Python as the messes they are :)
«Where is the Life we have lost in living? Where is the wisdom we have lost in knowledge? Where is the knowledge we have lost in information?» T. S. Elliot
Hi Bill. I hope your right. You do get some lift of confidence when the program runs without errors. With me it's a case of getting out of the habit of script coding like I did with Basic and QuickBasic. Brian
-
Some good caffeine in there ! :omg:
«Where is the Life we have lost in living? Where is the wisdom we have lost in knowledge? Where is the knowledge we have lost in information?» T. S. Elliot
Heavy duty wake up juice! ;)
Sent from my Amstrad PC 1640 Never throw anything away, Griff Bad command or file name. Bad, bad command! Sit! Stay! Staaaay... AntiTwitter: @DalekDave is now a follower!
-
Thanks Griff. I liked examples like these you've given me. You wrote:: eagle = new Sparrow() I thought you may have to use: Bird eagle = new Sparrow() . Is it because you have already defined the eagle as a bird (Bird eagle = new Eagle();) that you don't need to do this? Brian
If you do this:
private void DoSummat()
{
Bird eagle = new Eagle();
...
eagle = new Sparrow();
...
}You are just reusing the existing variable, like you do without worrying about classes:
int i = 1;
while (true)
{
Console.WriteLine(i);
i = i + 1;
}If you tried to create a new variable with the same name in the same scope:
private void DoSummat()
{
Bird eagle = new Eagle();
...
Bird eagle = new Sparrow();
...
}You would get an error as it already exists - just the same as you can't do this:
for (int i = 0; i < 10; i++)
{
Console.Write($"{i} :");
for (int i = 100; i < 110; i++)
{
Console.Write(i);
}
Console.WriteLine();
}You can't have two loop guards with the same name! Or even this:
private void DoSummat(int x)
{
int x = 666;
...
}Because the parameter and variable are the same name.
Sent from my Amstrad PC 1640 Never throw anything away, Griff Bad command or file name. Bad, bad command! Sit! Stay! Staaaay... AntiTwitter: @DalekDave is now a follower!
-
Now I've had some coffee, I'll add some thoughts for you. If you allowed
fox = new animal();
without the type specifier, what problems might it cause? Well, consider this:
public animal fox { get; set; }
public void DoSummat(animal a)
{
fox = a;
...
}Is the
fox
assignment insideDoSummat
meant to create a new local instance which is scoped to just the method, or to affect the public property? How could you tell? How could I tell when I tried to fix a problem in 100,000 lines of code next year? Worse, isfox
supposed to be ananimal
, or amammal
, or aCanidae
? Does it make a difference? Yes - it does. Becausebird
is a type ofanimal
but afox
doesn't have aFlapWings
method! So if you allow implicit typing, then the compiler has to assume the lowest common type in the hierarchy and that could mean that methods you expect to work just don't exist for that actual instance. And consider this:public void DoSummat(animal a)
{
fox = a;
...
fax = b;
...
}Is
fax
a new variable, or did I mistypefox
? How would you tell? C# is a strongly typed language: which means that there is no implicit declarations, no automatic type changing (except where data won't be lost such asint
todouble
for example), and heavy duty type checking - which makes your code more robust because it finds problems at compile time, instead of hoping you tested all the possible routes through the code and didn't leave a "bad type" in there.Sent from my Amstrad PC 1640 Never throw anything away, Griff Bad command or file name. Bad, bad command! Sit! Stay! Staaaay... AntiTwitter: @DalekDave is now a follower!