2011-12-13 2 views
0

У меня есть интерфейс [a] и класс-исполнитель [b]. [b] имеют свои собственные методы помимо реализованных.Что происходит с полиморфизмом в C#

//----------- 
public interface a 
{ 
void functionA(); 
} 
//----------- 

public class b:a 
{ 
void functionA(){} 
void functionB(){} 

} 
//------------ 

В проекте X внутри решения. Когда код I: [Проект это библиотека классов]

a test = new b(); 
test.functionB(); //It Works 

В другом проекте с ссылками на библиотеки [Консоль приложения]

a test = new b(); 
test.functionB(); //Error CS1061 --> a doesn't have a method called function b 

Извините, но имена на испанском языке. Интерфейс: pastebin.com/Unm5Adkd, исполнитель: pastebin.com/wmikck9H, программа: консольное приложение: pastebin.com/Yus91hQL ... Спасибо всем за вашу помощь. : P

+8

Ни один из них не должен работать; 'a' не имеет метода, называемого' functionB'. –

+3

Образец кода, который работает, является ошибкой. Приведенный вами код должен составлять только первый образец, если существует метод расширения. Код, который вы предоставили сам по себе, никогда не будет компилировать этот образец. Вы опустили какой-то код? – JaredPar

+1

Вы объявляете первый пример, используя ключевое слово «var»? Я думаю, вам нужно опубликовать полный пример, демонстрирующий вашу проблему. –

ответ

2

Я предполагаю, что вы спрашиваете, почему вы получаете ошибку CS1061.

Это просто. В вашем консольном приложении, даже если вы создаете экземпляр объекта типа «b» («new b()»), вы, похоже, назначаете его переменной, ссылающейся на то, что является «a». Интерфейс «a» в соответствии с вашим образцом действительно не содержит метода, называемого «functionB()».

У вас есть два варианта в этом случае.

Вариант один добавляет метод «functionB()» для определения интерфейса, а также:

public interface a { 
    void functionA(){} 
    void functionB(){} 
} 

Вариант два убедившись, что переменная «а» в вашем консольное приложение имеет тип «B»:

b a = new b(); 
a.functionB(); 

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

+0

Спасибо за ваш ответ. Теперь скажем, отец и ребенок. Хотя Base не имеет этого метода, объект был создан как Child. Код: Base a = new Child(); работает внутри текущего проекта (библиотека классов), также метод отображается в autocomplete intellisense. Проблема находится вне этого проекта в консоли Apllication. Я не понимаю, что ссылка уже установлена. –

+0

Я думаю, вам нужно предоставить больше контекста, например. больше исходного кода как библиотеки, так и консольных приложений. В противном случае есть также варианты для того, что происходит не так. – Manfred

+0

Проект предназначен для образовательных целей, поэтому я могу опубликовать исходный код, но могу ли я загрузить его на IDB pastebin и поместить сюда ссылку? –