Я не уверен, что то, что я хочу сделать, нарушает объектно-ориентированные рекомендации или нет, поэтому я объясню, что я делаю, и, надеюсь, вы, ребята, сможете показать мне лучший способ, если я ошибаюсь. Я пытался задать этот вопрос раньше, но я привел плохой пример, так что я думаю, что это вызвало еще большую путаницу.
Итак, у меня есть основной класс, USBCommunicator. Конструктор принимает идентификатор продукта того типа устройства, с которым вы хотите общаться. У класса USBCommunicator также есть свойство для определенного серийного номера, с которым можно общаться. USBCommunicator имеет методы OpenConnection и CloseConnection, которые открывают или закрывают поток данных для передачи данных между устройством USB и ПК.
Для отправки данных через поток я хочу, чтобы USBCommunicator мог создавать экземпляр класса Report, устанавливать некоторые параметры, такие как тайм-ауты, ReportID и т. Д., А затем вызывать метод Send () класса Report для фактической отправки данные. Я не думаю, что какой-либо другой класс, кроме USBCommunicator, сможет создать экземпляр класса Report. (Например, Лодка не должна создавать экземпляры класса CarDoor, потому что лодка не может иметь автомобильную дверь.) Наконец, я изначально думал, что класс Report должен иметь доступ к членам USBCommunicator. но я думаю, что это не так. Если USBCommunicator открывает поток на устройстве, все, что действительно нужно отчету - это параметр, переданный в качестве ссылки / дескриптора открытого потока. Но в какой форме должен быть этот поток, чтобы он мог передавать его приложению высокого уровня? публичная собственность? Это не совсем верно.
Итак, вот что у меня есть ...
namespace USBTools
{
class HighLevelApplication
{
void main()
{
USBCommunicator myUSB = new USBCommunicator("15B3");
myUSB.SerialNumber = "123ABC";
myUSB.OpenConnection();
myUSB.Report ReportToSend = new myUSB.Report(//how do I pass the stream here?);
//It would be nice if I didn't have to pass in the stream because the stream shouldn't
//be publicly available to the HighLevelApplication class right?
ReportToSend.ReportID = 3;
ReportToSend.Timeout = 1000;
ReportToSend.Data = "Send this Data";
ReportToSend.Send();
}
}
class myUSB
{
myUSB(string PID)
{
//...
}
// public SerialNumber property
// private stream field ???
// public OpenConnection and CloseConnection methods
class Report
{
Report(stream StreamToUse)
{
//...
}
Send()
{
//send the data
}
}
}
}