2014-01-27 19 views
0

В следующем примере:Работа с объектами в C#

class Base 
{ 
    public void TestMethod() 
    { 
     Console.WriteLine("Base Class"); 
    } 
} 

class Derived : Base 
{ 
    public void DerivedTestMethod() 
    { 
     Console.WriteLine("Derived Class"); 
    } 
} 

class Demo 
{ 
    public static void Main() 
    { 
     Base Obj = new Derived(); 
     Obj.DerivedTestMethod(); //Error Line 
    } 
} 

Почему я не могу получить доступ к методу DerivedTestMethod() в производном классе, когда я создал объект для производного класса, используя новый?

+2

конечно, 'Base' не' DerivedTestMethod'. –

+0

, потому что объект, с которым вы работаете, имеет тип 'Base' – Ric

+0

Можете ли вы объяснить немного больше о том, что« Base не имеет этого метода » –

ответ

4

Ваш объект имеет тип Derived, а это означает, что он действительно имеет метод DerivedTestMethod.

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


Вот пример кода, попробуйте использовать var ключевое слово, а затем newing вверх Derived класс:

class Demo 
{ 
public static void Main() 
    { 
     var Obj = new Derived(); 
     Obj.DerivedTestMethod(); 
    } 
} 

Однако, если вы все еще хотите явно объявить его первым типом Base, или когда вы получаете объект, который находится в этом Base, тогда вы можете проверить, действительно ли переменная Obj класса Derived с использованием ключевого слова C# is

if(Obj is Derived) // testing with the "is" keyword 
{ 
    Obj = (Derived)obj; // here we cast it 
} 
else 
{ 
    // Other code, but now we know that the "Obj" variable isn't of type "Derived". 
} 

Для получения дополнительной информации о тестировании с «это» ключевое слово, обратитесь к документации MSDN http://msdn.microsoft.com/en-us/library/scekt9xw.aspx или проверить этот ответ: https://stackoverflow.com/a/10416231/1155847

0

Другие ответы на все содержат существенные опасности и упущения (например, просто попытка бросить без тестирования может быть опасна - если вы действительно не знаете, что можете применить к данному типу).

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

Потому что вы указали его как «базовый» класс , попробуйте использовать ключевое слово «var», а затем добавьте класс «Производный».

class Demo 
{ 
public static void Main() 
    { 
     var Obj = new Derived(); 
     Obj.DerivedTestMethod(); 
    } 
} 

Однако, если вы все еще хотите явно объявить его первым «Base»

Base Obj = new Derived(); 

, то вы можете проверить, является ли переменная «Obj» фактически класса «производный», используя C# «в» ключевое слово

if(Obj is Derived) 
{ 
    Obj = (Derived)obj; // here we cast it 
} 
else 
{ 
    // Other code, but now we know that the "Obj" variable isn't of type "Derived". 
} 

Для получения дополнительной информации о тестировании с «это» ключевое слово, обратитесь к документации MSDN http://msdn.microsoft.com/en-us/library/scekt9xw.aspx или проверить этот ответ: https://stackoverflow.com/a/10416231/1155847

1

Потому что вы ссылаетесь на тип Base. Хотя вы создаете объект типа Derived, ссылка на ваш объект имеет тип Base и Base не содержит DerivedTestMethod.

Итак, у вас есть объект типа Derived, и вы можете использовать его как Derived, CLR позволит вам вызывать только методы, доступные для типа ссылки (Base, в вашем случае).

0

С помощью Base Obj = new Derived(); вы создаете новый Derived-Object и затем назначаете его объекту типа Base. Базовый класс не имеет метода.

Если вы хотите, чтобы вызвать метод на Base-Object вы можете сделать:

((Derived)Obj).DerivedTestMethod(); 
+0

, пожалуйста, будьте более подробными и проинформируйте пользователя (как я сделал в своем ответе stackoverflow.com/a/21376436/1155847), что подобное использование может удерживать определенные опасности и что есть способ проверить, можно ли применить переменную к определенного типа, используя ключевое слово «is». –

0

Следующая должно работать для вас:

Base Obj = new Derived(); 
((Dervived)Obj).DerivedTestMethod(); //Error Line 

В принципе, вы создавая экземпляр базы и вызывая метод из Derived, но вы должны быть в состоянии сделать достаточно легко.

+0

, пожалуйста, будьте более подробными и проинформируйте пользователя (как я сделал в своем ответе stackoverflow.com/a/21376436/1155847), что подобное использование может удерживать определенные опасности и что есть способ проверить, можно ли применить переменную к определенного типа, используя ключевое слово «is». –

+0

Конечно, есть способ t test, если переменную можно отличить. Однако в этом случае я бы сказал, что результирующая ошибка времени выполнения, если она не может быть предпочтительной. –

+0

Это не об этом, речь идет об информировании пользователя, задающего вопрос и доставке всего контекстного ответа и рассказывающего о том, что в решении литья есть проблемы. И тот может протестировать до кастинга без него, что приведет к ошибкам во время выполнения. Потому что иногда ошибки не являются «предпочтительными». –

0

Вы можете достичь его следующим образом:

Derived Obj = new Derived(); 
    Obj.DerivedTestMethod(); 

ИЛИ

Base Obj = new Derived(); 
    ((Derived)Obj).DerivedTestMethod(); 
+0

, пожалуйста, будьте более подробными и проинформируйте пользователя (как я сделал в своем ответе http://stackoverflow.com/a/21376436/1155847), что подобное использование может удерживать определенные опасности и что есть способ проверить, можно ли использовать переменная к определенному типу, используя ключевое слово «is». –

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