ліццё паміж базавым класам і даччынымі класамі

У мяне ёсць пытанне аб прывядзенні паміж базавым класам і яго даччынымі класамі:

(1) Чаму гэта дазволена?

BaseClass b = new ChildClassA();
ChildClassA c = (ChildClassA)b

(2) Чаму гэта не дазволена?

ChildClassA c = (ChildClassA)new BaseClass();
BaseClass b = (BaseClass)c;

(3) Чаму гэта дазволена?

BaseClass b = new BaseClass();
ChildClassA c = (ChildClassA)c;

(4) Чаму гэта дазволена?

ChildClassA c = new ChildClassA();
BaseClass b = (BaseClass)c;
1
Заўважым, што (2) <�я> з'яўляецца </я> дазволена кампілятарам - але вы атрымаеце InvalidCastException падчас выканання.
дададзена аўтар Matthew Watson, крыніца

6 адказы

Прычыны літой альбо дапускаюцца ці не дапускаюцца аза за ўспадкоўванне.

Клас дзіцяці (або вытворны клас) заўсёды з'яўляецца базавым класам, але зваротнае не дакладна.

Для тлумачэння, давайце выкарыстоўваць некаторыя больш рэальныя імёны свету для вашага прыкладу класаў:

class Animal
{
}

class Dog : Animal
{
}

class Cat : Animal
{
}

Такім чынам, для вашага (1), напрыклад:

Animal b = new Dog();
Dog c = (Dog)b

Гэта дакладна, таму што ўсе сабакі з'яўляюцца жывёламі і ваша жывёла б на самай справе сабака так адліванага паспяхова.

Для прыкладу (2):

Dog c = (Dog)new Animal();
Animal b = (Animal)c;

Гэта немагчыма, таму што вы прызначаеце аб'ект жывёлы да сабачку, але вы ведаеце, што не ўсе жывёлы Сабака, некаторыя жывёлы кошкі.

And for examples (3) & (4):

Dog c = new Dog();
Animal b = (Animal)c;

This is the same as your example 1 above. All dogs are animals, so any dog can be classified as an animal and cast (in fact you don't need the cast, there would be an implicit cast and you can write it as Animal b = c;

4
дададзена
Я не knwo чаму я збіраўся змяніць свой адказ, і я хацеў бы выкарыстаць прыклад сабакі таксама. Я думаю, што ў свеце вучэнні знаходжання жывёл у праграмаванні, як пчолы знаходжанне ў сексе
дададзена аўтар Fabio Marcolini, крыніца

Падумайце, з пункту гледжання «гэта». Можна сказаць, любы асобнік ChildClassA "з'яўляецца" BaseClass , дзе Клас ChildClassA: BaseClass . Але гэта не дакладна для наадварот. Мы не можам сказаць, любы асобнік BaseClass «з'яўляецца» ChildClassA у гэтым выпадку

Цяпер паспрабуйце чытаць вашыя радкі кодаў наступным чынам. Я лічу, што гэта будзе мець больш сэнсу ў гэты раз.

new ChildClassA() is an instance of ChildClassA then it also "is a" BaseClass. So we can assign new ChildClassA() to b which is of type BaseClass

Мы можам адліваць B у ChildClassA , таму што ён на самай справе (кропкі) на асобнік ChildClassA .

We can not cast new BaseClass() to ChildClassA because instance of BaseClass "is not a" ChildClassA

1
дададзена
<�Р> (1) Чаму гэта дазволена? BaseClass б = новы ChildClassA (); ChildClassA   з = (ChildClassA) б </р>

Паколькі ChildClassA З'ЯЎЛЯЕЦЦА BaseClass.

<�Р> (2) Чаму гэта не дазволена? ChildClassA з = (ChildClassA) новы   BaseClass (); BaseClass Ь = (BaseClass) с; </р>

Паколькі BaseClass НЕ З'ЯЎЛЯЕЦЦА ChildClassA

<�Р> (3) Чаму гэта дазволена? ChildClassA з = новы ChildClassA (); BaseClass   б = (BaseClass) с; </р>

Паколькі ChildClassA З'ЯЎЛЯЕЦЦА BaseClass.

<�Р> (4) Чаму гэта дазволена? ChildClassA з = новы ChildClassA (); BaseClass   б = (BaseClass) с; </р>

Тое ж, што пытанне 3.

Пры стварэнні спадчыну класа, клас можа быць ператвораны ў асобнік базавага класа, таму што ён з'яўляецца нашчадкам гэтага класа. Тым не менш, пры спробе стварыць даччыны клас з аб'ектам базавага класа, базавы клас не мае ўсю інфармацыю аб даччыным класе.

<�Моцны> Дзіця ведае, што пра яго бацькоў, але бацька не ведае, што ў дзіцяці ёсць.

1
дададзена

Ну ...

(2) не дапускаецца, таму што вы не можаце кінуць BaseClass у ChildClassA - асобнік ChildClassA гэта па спадчыне таксама BaseClass , але не наадварот!

0
дададзена

Наогул кажучы, гэта таму, што ChildClassA можа быць вызначана тое, што BaseClass не ведае пра, у той час як, таму што ChildClassA паходзіць ад BaseClass, ён ведае ўсё пра гэта.

0
дададзена
    <�Літый> дазволена, таму што б сапраўды ChildClassA
  1. не дапускаецца, так як вы не можаце кінуць BaseClass да ChildClass паколькі BaseClass не ўтрымліваюць вызначэнне, неабходнае для працы ChildClass
  2. дазволена, паколькі ChildClass змяшчае ўсе вызначэння для BaseClass і ChildClass З'ЯЎЛЯЕЦЦА BaseClass 4.same як 3? </Літый>
0
дададзена