2016-04-01 2 views
1

Я новичок в C# или ООП в целом, и был интересно, если рядом можно с наследованием:Скрыть производный класс

я хочу, чтобы настроить канал связи и хочу, чтобы иметь возможность использовать UDP или последовательную связь. Так я определить абстрактный базовый класс «Ссылка» с методами .Open, .close, Пошлите, .receive Из этого базового класса я получить «LinkUdp» 2 классов и «LinkSerial» и переопределить 4 метода

сейчас возможно ли напрямую писать код с объектом в класс «Ссылка»? Я имею в виду:

Ссылка myLink = новая ссылка ("10.0.0.1"); // теперь компилятор знает, что использовать LinkUdp класс
Ссылка myLink = новая ссылка («COM1»); // компилятор знает использовать LinkSerial класс

или я должен написать мой код, посвященный как:

LinkUdp MyLink = новый LinkUdp ("10.0.0.1");

Надеется, что это достаточно ясно ... Благодаря

редактировать: я хотел бы использовать класс «Link», таким образом я могу передать объект на подкласс без необходимости писать 2 различные реализации : поэтому после этого у меня есть класс

CommunicationHandler myComm = new CommunicationHandler (myLink);

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

+0

Я думаю, вы должны реализовать Factory Pattern использовать эту ссылку для понимания http://www.dofactory.com/net/factory-method-design-pattern – rashfmnb

+0

Если 'Link 'является абстрактным классом, то вы никогда не сможете напрямую создать его экземпляр. 'new Link (...)' недействителен. –

ответ

1

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

Это возможно, хотя и показывает один из преимуществ наследования:

Link myLink; 
myLink = new LinkUdp("10.0.0.1"); 
myLink = new LinkSerial("10.0.0.1"); 

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

+0

так, как в моем правлении выше: я мог бы передать этот myLink другому методу, и не было бы проблем, например, вызвать myLink.Open(). До тех пор, пока существуют ссылки LinkUdp.Open() и LinkSerial.Open()? Тогда это должен быть ответ на мою проблему.Спасибо – JakkeFire

+0

Да, не беспокойтесь об этом. Просто используйте 'Link' как тип для вашего параметра. –

+0

И эти методы должны быть определены в базовом классе, возможно, «abstract» с реализацией в производных классах. –

7

Нет конструктора класса может возвращать только этот тип класса. В качестве альтернативы вы могли бы иметь статическую функцию Create (заводская модель):

Link myLink = Link.Create("10.0.0.1"); 

например

public static Link Create(string something) 
{ 
    if (//determine that "something" is an IP address)) 
     return new LinkUdp(something); 
    else 
     return new LinkSerial(something); 

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