2014-09-25 4 views
-5

У меня есть четыре класса:как остановить назначая производный объект класса для базового класса указателя

class Base 
{ 
    public void printf() 
    { 
     Console.WriteLine("I am from base !!!"); 
    } 
} 

class DerivedA : Base 
{ 
    public void printf() 
    { 
     Console.WriteLine("I am from derived A !!!"); 
    } 
} 

class DerivedB : Base 
{ 
    public void printf() 
    { 
     Console.WriteLine("I am from derived B !!!"); 
    } 
} 

class testProgram 
{ 
    public void print(Base baseClass) 
    { 
     baseClass.printf(); 
    } 
} 

моя цель состоит в том, когда я выполнить следующий код, в строке 4 он должен дать мне ошибку компиляции.

testProgram tP = new testProgram(); 
tP.print(baseClass); 
tP.print(derivedA); 
tP.print(derivedB); 

Какие изменения мне нужно сделать?

+0

Что отличает его от 3-й линии? – Servy

+0

Не наследуйте базу. Задача решена. Предоставьте дополнительную информацию, если вам нужна дополнительная помощь, хотя, похоже, у вас есть проблема с дизайном, если производный класс не может быть заменен вашей базой. –

+0

Включите ошибку компилятора. «Это дало мне ошибку» не полезно. – Gutblender

ответ

0

Вы не можете сделать это вообще во время компиляции (легко сделать во время выполнения).

Вы можете специальные тематические конкретные классы, предоставляя явные перегруженные версии:

public void print(Base baseClass)... 

[ObsoleteAttribute("This method not supported for DerivedB.", true)] 
public void print(DerivedB baseClass) {} 

Примечание: это только полезно, если у вас есть тип во время компиляции:

print(new DerivedB()); // error 
print((Base)new DerivedB()); // success 
+1

Это не мешает вызывать метод с экземпляром 'DerivedB', который передается в' Base'. – Servy

+0

@Servy - хороший момент, добавлено примечание к сообщению. –

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