뭔가이처럼 보이는이려고 따라 호출 :C#을 자녀에 대한 상속 정적 속성의 설정 값과 하위 유형
상속의 목적은class SerialEquipment
{
private int baudrate;
......
public SerialEquipment(int baudrate)
{
this.baudrate= baudrate;
}
public int Baudrate{ get => baudrate; set => baudrate= value; }
......
public static void IdentifyEquipment<EquipmentType>()
{
int baudrate = (int)typeof(EquipmentType).GetProperty("Baudrate", BindingFlags.Static | BindingFlags.Public).GetValue(null, null);
........
}
}
class EquipmentTypeA: SerialEquipment
{
private static readonly int baudrate = 9600;
......
public EquipmentTypeA() : base(baudrate) { }
public static new int Baudrate{ get => baudrate}
......
}
class EquipmentTypeB : SerialEquipment
{
private static readonly int baudrate = 38400;
......
public EquipmentTypeB() : base(baudrate) { }
public static new int Baudrate { get => baudrate }
......
}
있지만 중복을 방지하기를 내가 할 수있는 내 사용을 위해 더 나은 것을 찾지 못한다. 선언문을 하나만 가질 수있는 방법을 찾을 수 없습니다. 이것을 구현하는 더 좋은 방법이 있습니까?
편집 2018년 3월 1일 : 여기에 새로운 구현
public static List<String> IdentifyEquipment<EquipmentType>()
{
List<String> wantedEquipmentList = new List<String>();
int baudrate = (int)typeof(EquipmentType).GetProperty("Baudrate", BindingFlags.Static | BindingFlags.Public).GetValue(null, null);
String identificationCommand = (int)typeof(EquipmentType).GetProperty("Baudrate", BindingFlags.Static | BindingFlags.Public).GetValue(null, null);
String correctIdentificationResponse = (String)typeof(EquipmentType).GetProperty("CorrectIdentificationResponse", BindingFlags.Static | BindingFlags.Public).GetValue(null, null);
foreach (String aSerialPort in SerialPort.GetPortNames())
{
SerialPort deviceInTest = new SerialPort(aSerialPort, baudrate);
deviceInTest.Open();
deviceInTest.WriteLine(identificationCommand);
System.Threading.Thread.Sleep(50);
string result = deviceInTest.ReadLine();
if (result.StartsWith(correctIdentificationResponse))
{
wantedEquipmentList.Add(aSerialPort);
}
}
return wantedEquipmentList;
}
와 브루노 Belmonde 솔루션에 관한 :
class DeviceIdentifier
{
private List<DeviceFactory> factories = new List<DeviceFactory>();
public void AddDeviceType(DeviceFactory factory) => factories.Add(factory);
public ISerialDevice BuildDeviceByIdentification(String comPort, int baudrate, String identificationCommand, String identificationResponse) => factories.FirstOrDefault(deviceFactory => IdentifyEquipment(comPort, baudrate, identificationCommand, identificationResponse))?.Builder();
private bool IdentifyEquipment(String comPort, int baudrate, String identificationCommand, String identificationResponse)
{
bool foundIt = false;
SerialPort deviceInTest = new SerialPort(comPort, baudrate);
deviceInTest.ReadTimeout = 200;
deviceInTest.Open();
try
{
deviceInTest.WriteLine(identificationCommand);
System.Threading.Thread.Sleep(50);
string result = deviceInTest.ReadLine();
if (result.StartsWith(identificationResponse))
{
foundIt = true;
}
}
catch
{
//........
}
deviceInTest.Close();
return foundIt;
}
}
// MAIN
DeviceIdentifier deviceIdentifier = new DeviceIdentifier();
List<EquipmentTypeA> typeAList = new List<EquipmentTypeA>();
deviceIdentifier.AddDeviceType(new DeviceFactory
{
Baudrate = 9600,
IdentificationCommand = "You are ?",
IdentificationResponse = "Type A",
Builder =() => new EquipmentTypeA(9600)
});
foreach(String aSerialPort in SerialPort.GetPortNames())
{
ISerialDevice identifiedObject = deviceIdentifier.BuildDeviceByIdentification(aSerialPort, 9600, "You are ?", "Type A");
if (identifiedObject != null)
typeAList.Add((EquipmentTypeA)identifiedObject);
}
기능 장비를 식별하기 위해 정적 사용하여 다음과 같습니다
가장 먼저 떠오르는 질문은 어떻게 사용 하시겠습니까? 대답은 유스 케이스에 따라 달라질 것이다. 정적 메서드를 재정의하면 다형성 컬렉션 (또는 다형성 선언)이있는 경우 작동하지 않으므로 나쁜 선택이 될 수 있습니다. –
차량 휠에 대해 2,3,4,6,10 개의 옵션 만 사용할 수 있습니다. .. 단지 열거 형을 사용하십시오 ... * shrug * –
@BrunoBelmondo이 예제의 값 wheelsNumber는 직렬 장비 (기본 클래스)의 다른 종류 (하위 클래스)의 기본 통신 속도에 해당합니다. 나는 통신 속도와 다른 많은 정적 속성들을 사용하여 내가 말하고있는 장비를 먼저 확인한 다음, 그것을 사용하기 시작했습니다. – Dairon