2015-07-13 2 views
0
public class ABC 
    { 
    } 

    public class DEF : ABC 
    { 
    } 

    public class Class1 
    { 
     ABC abc = new DEF(); //No error 
     DEF def = new ABC(); //Compile time error 
    } 

Может кто-нибудь объяснить мне этот сценарий. и при каких обстоятельствах мы можем его использовать.C# Наследие доступа путаницы

ответ

1

Это называется Ploymorphism. Как объяснено в MSDN

Во время выполнения, объекты производного класса может рассматриваться как объекты базового класса в таких местах, как параметры метода и коллекции или массивов. Когда это происходит, объявленный тип объекта больше не , идентичный его типу времени выполнения.

Базовые классы могут определять и реализовывать виртуальные методы, а производные классы могут переопределять их, что означает, что они предоставляют собственное определение и реализацию . Во время выполнения, когда клиентский код вызывает метод , CLR просматривает тип времени выполнения объекта и вызывает , что переопределяет виртуальный метод. Таким образом, в вашем исходном коде вы можете вызвать метод в базовом классе и вызвать версию производного класса метода, который должен быть выполнен.

Ответ на этот вопрос лучше всего объясняется здесь MSDN Polymorphism

+0

эта ссылка очищено все. Большое спасибо –

2

Его так как в соответствии с правилом OOD вы можете назначить дочерний элемент родительскому, но вы не можете назначить родителя ребенку.

//this possible as you re assigning child to parent 
    ABC abc = new DEF(); //No error 
    //this is illegal as you are trying to assign child to parent directly 
    DEF def = new ABC(); //Compile time error 

Пересмотрите свой дизайн, или, если вы хотите, чтобы преобразовать родительский объект для ребенка, чем нужно метод для этого преобразования непосредственно его не представляется возможным, чтобы сделать это в соответствии с правилами OOD.


Рассмотрите пример отношения клиентов в реальном времени и RetailCustomer или Corporatecustomer банка. Если вы легко можете сказать, что RetailCustomer или CorporateCustomer - это Клиент, но вы не можете сказать, что Клиент является RetailCustomer или CorporateCustomer, потому что клиент может быть любого типа.

То же касается отношений между родительским классом формы и дочерним прямоугольником, кругом и т. Д. Классом.

+0

Спасибо. Я просто спросил его здесь, потому что кто-то в интервью задал мне этот вопрос, и я смутился ... как ребенок в толпе смутился! –

+0

@MayurMohite - помимо принятого ответа вы также можете поместить некоторый реальный мир senario, как я дал в обновленном ответе ... –

1

Скажем ABC является Person, в то время как DEF является Student (который является подклассом Person). Вы всегда можете обращаться к Student как Person, поэтому присвоение abc (типа Person) от Student правильно, но вы не можете рассматривать общий Person как Student, поэтому назначение def неправильно (например, вы не можете получить номер студента человека, который не является студентом)

+0

да ... простая логика, спасибо! –

Смежные вопросы