문제

일부 기능을 공유하는 두 개의 콘솔 앱, 쿼리 및 업데이트가 있습니다. 두 개의 클래스가 공통 기본 클래스에서 상속 받기를 원했지만 문제는 콘솔 앱의 경우 static Main 기능. 내가 현재 가지고있는 것은 다음과 같습니다.

namespace Utils
{
    public class ConsoleBase
    {
        protected const int ERROR_EXIT_CODE = 1;
        protected static void printWarning(string msg) {...}
        public ConsoleBase(IEnumerable<string> args) { ... }
...

namespace Update
{
    class Update : ConsoleBase
    {
        private static ConsoleBase _consoleBase;
        public static void Main(string[] args) { ... }
...

namespace Query
{
    class Query : ConsoleBase
    {
        private static ConsoleBase _consoleBase;
        public static void Main(string[] args) { ... }
...

둘 다 상속하는 디자인 문제처럼 보입니다. ConsoleBase 뿐만 아니라 인스턴스가 static 각 파생 클래스 내 변수. 내가 이것을하는 이유는 다음과 같습니다.

  1. 나는 가질 수있다 protected static 정의 된 방법 ConsoleBase 다른 사람이 접근 할 수 있습니다 static 파생 클래스의 방법.
  2. 명령 줄 인수를 제작자에게 전달할 수 있습니다. ConsoleBase, 일반적인 작업을 수행 한 다음 파생 클래스에서 다시 인수에 액세스하십시오. public 인스턴스의 속성 및 방법 ConsoleBase.

따라서 파생 클래스에서는 인스턴스에 대한 방법/속성에 대한 호출이 혼합되어 있습니다. ConsoleBase, 예를 들어

_consoleBase.UseDebugMode()

상속 된 정적 메소드를 호출하고 정의 된 상속 상수에 액세스하는 것뿐만 아니라 ConsoleBase, 예를 들어

printWarning(CONST_MSG_IN_BASE_CLASS);

어떻게 든 이것을 청소할 수 있습니까? 수업에서 상속하고 함께 일하기 위해 기본 클래스의 인스턴스를 유지하는 것이 좋지 않습니까?

도움이 되었습니까?

해결책

이와 같은 정적 및 인스턴스 방법을 혼합하지 마십시오.

정적 방법이 상속받을 수있는 다른 클래스로 제공하는 책임을 분리하십시오. 비 정적 기능을 업데이트 및 쿼리 내에서 집계하고 인스턴스화하는 별도의 클래스로 만드십시오.

게다가, 업데이트 및 쿼리가 Consolebase의 파생 상품 인 경우 - 왜 집계 인스턴스가 필요합니까?

다른 팁

예, 보호 된 정적 메인으로 기본 클래스를 정의한 다음 상속 클래스의 기본 메소드에서 BaseClass.Main (Args)을 호출 할 수 있습니다.

이 syntex는 더 정확합니다.

public class BaseApp
{
    public static Main(String[] args)
    {
        // TODO: ...
    }
}

public class App1 : BaseApp // Same for App2
{
    // There is no need to keep a reference of the base class
    // if you are accessing static methods only

    public static Main(String[] args)
    {
        BaseApp.Main(args); // Access via class, not via instance
    }
}

나는 당신이 그렇게 할 필요가 없다고 생각합니다. 명령 줄 인수와 함께 ConsoleBase.Main () 함수를 호출하지 않는 이유는 무엇입니까?

기본 클래스의 인스턴스를 갖는 것은 설계 문제입니다.

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