초록 수업, 생성자 및 공동
-
03-07-2019 - |
문제
글쎄, 나는 c# 코드의 일부를 재사용하려고 노력하고있다. UDP 서버가있는 초록 클래스이며 여기에서 볼 수 있습니다.
http://clutch-inc.com/blog/?p=4
나는 다음과 같은 파생 수업을 만들었습니다.
public class TheServer : UDPServer
{
protected override void PacketReceived(UDPPacketBuffer buffer)
{
}
protected override void PacketSent(UDPPacketBuffer buffer, int bytesSent)
{
}
}
그리고 내 앱에서 나는 다음과 같은 파생 클래스의 인스턴스를 만들었습니다.
TheServer serv = new TheServer(20501);
serv.Start();
그러나 나는 오류가 있고 왜 그런지 이해하지 못한다. 도와주세요.
- 'TheProject.이 서버'는 '1'인수를 취하는 생성자가 포함되어 있지 않습니다.
- 'TheProject.udpserver.start ()'는 보호 수준으로 인해 접근 할 수 없습니다.
- 'TheProject.udpserver'는 '0'인수를 취하는 생성자가 포함되어 있지 않습니다.
해결책
생성자는 C#에서 상속받지 않습니다. 수동으로 체인해야합니다.
public TheServer(int port)
: base(port)
{
}
또한 Start가 보호되면이를 호출하는 일종의 공개 방법을 만들어야합니다.
public void StartServer()
{
Start();
}
다른 팁
파생 클래스는 1 파라미터 생성자를 추가하고 기본 클래스에 위임해야합니다.
public TheServer(int port) : base(port) {}
또한, Start
방법이 보호됩니다. 직접 필요합니다.
public void StartMe(){base.Start();}
이러한 오류는 실제로 매우 간단한 원인을 가지고 있습니다.
파생 클래스에서 생성자를 정의하지 않았습니다 (
TheServer
). 생성자 (물론 방법과 달리)는 자동으로 상속되지 않으므로 부모 클래스의 것과 일치하는 생성자를 선언하고 다음과 같은 것을 사용하여 함께 체인해야합니다.public TheServer(int port) : base(port) { // Your code here. } public TheServer() : base() { // Your code here. }
그만큼
Start
방법은 다음과 같이 선언됩니다protected
베이스에서 (UDPServer
) 수업. 기본 클래스의 액세스 수정자를public
, 또는 필요할 때 파생 수업에서 메소드를 호출하는 방법을 알아 내십시오 (후자는 작가가 의도 했어야합니다.UDPServer
).- 1과 동일한 이유는 기본값 (매개 변수가없는) 생성자를 참조합니다.
도움이되기를 바랍니다.
당신은 하나의 인수가있는 TheServer 생성자를 정의하지 않았으므로 TheServer (20501)를 호출 할 수 없습니다. Udpserver에 대한 제로 인수 생성자를 정의하지는 않았지만 하나의 인수로 정의했습니다. TheServer의 두 가지 방법은 보호되므로 #2의 오류입니다.
- 그리고 3.
기본 생성자 (udpserver)를 호출하는 theserver에 생성자를 추가합니다. 이 같은:
public TheServer(int port) : base(port) {}
2 UDPSERVER에서 시작 방법을 확인하십시오. 보호됩니다. 이는 해당 클래스의 서브 클래스 만 호출 할 수 있음을 의미합니다.
public class TheServer
{
public TheServer():base(port) {
}
}
var myServer = new TheServer(1337).Brings().All().The().Boys().to().The().Yard()
코드를 추상 클래스에 게시해야하지만 완전히 추측 할 수 있습니다.
당신은 A가 있습니다 ctor
TheServer 클래스에서 구현하지 않은 udpserver 클래스에서 ... 당신은 ...와 같은 것이 필요합니다.
public TheServer(int port) : base(port)
{
... specifics
}
또한 TheServer 클래스에서 Start () 메소드를 무시하는 것을 잊었지만 기본 클래스에서 비공개로 표시되어 있습니다 ... 기본 클래스는 ...와 같은 것을 가져야합니다.
//In UDPServer
protected void Start()
{
//Code to start
}
//In TheServer
protected void StartTheServer()
{
base.Start();
}
그리고 그 가치가있는 것에 대해 다음을 사용하는 것이 좋습니다.
UDPServer serv = new TheServer(20501);
serv.start();
또는 아마도 더 일반적인 서버 일 것입니다. Serv에서 전화 해야하는 방법에 따라 다릅니다.