문제

글쎄, 나는 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();

그러나 나는 오류가 있고 왜 그런지 이해하지 못한다. 도와주세요.

  1. 'TheProject.이 서버'는 '1'인수를 취하는 생성자가 포함되어 있지 않습니다.
  2. 'TheProject.udpserver.start ()'는 보호 수준으로 인해 접근 할 수 없습니다.
  3. '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();}

이러한 오류는 실제로 매우 간단한 원인을 가지고 있습니다.

  1. 파생 클래스에서 생성자를 정의하지 않았습니다 (TheServer). 생성자 (물론 방법과 달리)는 자동으로 상속되지 않으므로 부모 클래스의 것과 일치하는 생성자를 선언하고 다음과 같은 것을 사용하여 함께 체인해야합니다.

    public TheServer(int port) : base(port)
    {
        // Your code here.
    }
    
    public TheServer() : base()
    {
        // Your code here.
    }
    
  2. 그만큼 Start 방법은 다음과 같이 선언됩니다 protected 베이스에서 (UDPServer) 수업. 기본 클래스의 액세스 수정자를 public, 또는 필요할 때 파생 수업에서 메소드를 호출하는 방법을 알아 내십시오 (후자는 작가가 의도 했어야합니다. UDPServer).

  3. 1과 동일한 이유는 기본값 (매개 변수가없는) 생성자를 참조합니다.

도움이되기를 바랍니다.

당신은 하나의 인수가있는 TheServer 생성자를 정의하지 않았으므로 TheServer (20501)를 호출 할 수 없습니다. Udpserver에 대한 제로 인수 생성자를 정의하지는 않았지만 하나의 인수로 정의했습니다. TheServer의 두 가지 방법은 보호되므로 #2의 오류입니다.

  1. 그리고 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에서 전화 해야하는 방법에 따라 다릅니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top