C# 콘솔 앱 간의 공유 기능
-
05-07-2019 - |
문제
일부 기능을 공유하는 두 개의 콘솔 앱, 쿼리 및 업데이트가 있습니다. 두 개의 클래스가 공통 기본 클래스에서 상속 받기를 원했지만 문제는 콘솔 앱의 경우 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
각 파생 클래스 내 변수. 내가 이것을하는 이유는 다음과 같습니다.
- 나는 가질 수있다
protected static
정의 된 방법ConsoleBase
다른 사람이 접근 할 수 있습니다static
파생 클래스의 방법. - 명령 줄 인수를 제작자에게 전달할 수 있습니다.
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 () 함수를 호출하지 않는 이유는 무엇입니까?
기본 클래스의 인스턴스를 갖는 것은 설계 문제입니다.