簡體   English   中英

如何實現這個Base / Derived類結構?

[英]How to I implement this Base/Derived class structure?

我正在編寫一個C#應用程序,它讀取語言X的源代碼文件,並使用源文件中出現的類,方法等填充數據結構。

之后,使用我剛剛填充的這個數據結構,我可以調用這三個函數中的任何一個:

GenerateCS()
GenerateJava()
GenerateCPP()

基本上,它將語言X移植到這三種語言中的任何一種。

我的問題是,我如何構造這樣的,以便我有一個類GenerateCode作為基類,另一個生成函數從它派生? 我想每種語言的特定語法細節必須駐留在派生類本身中,但是我可以將哪些東西抽象到超類?

關於什么:

public enum Language
{
    CS,
    Java,
    CPP
}

public class CS: BaseClass { }
public class Java: BaseClass { }
public class Cpp: BaseClass { }

public class BaseClass
{
    public abstract BaseClass ConvertTo(Language lang);
}

要么

public class BaseClass
{
    public abstract FromClass(BaseClass class, Language lang);
}

我建議你從這樣的結構開始:

public class MetaCode
{
    private IList<Fields> fields;
    private IList<Properties> properties;
    private IList<Methods> methods;

    public IList<Fields> Fields
    {
        get { return this.fields; }
    }

    public IList<Properties> Properties
    {
        get { return this.properties; }
    }


    public IList<Methods> Methods
    {
        get { return this.methods; }
    }

    // etc...
}

public interface ISourceReader
{
    MetaCode ReadCode(string sourceCode);
}

public interface ISourceWriter
{
    string WriteCode(MetaCode metaCode);
}

public class CodeConverter
{
    private ISourceReader reader;
    private ISourceWriter writer;

    public CodeConverter(ISourceReader reader, ISourceWriter writer)
    {
        this.reader = reader;
        this.writer = writer;
    }

    public string Convert(string sourceCode)
    {
        MetaCode metaCode = this.reader.ReadCode(sourceCode);
        return this.writer.WriteCode(metaCode);
    }
}

這只是偽代碼,但您可以使接口遵循.NET框架中經常出現的StreamReader / StreamWriter模式。

接口允許整齊的擴展點,您可以在其中向應用程序添加新的源和目標編程語言。 這種方法最好的事情是CodeConverter類對存在的不同編程語言一無所知。 可以添加或刪除新的,不需要更改。 其他人甚至可以創建新的語言讀者/編寫者並使用它們而無需觸及您的代碼/編譯程序集。

說實話,考慮到這一點,我不認為有很多功能可以抽象到基類。 每種語言的細節都是如此具體,以至於基類很難正確完成。 無論如何,我總是建議從接口開始,因為無論編程語言有多么模糊/不同,你總是可以創建一個實現。

也許你可以創建幾個“輔助”基類,它們包含一些抽象功能,用於編程語言的不同通用樣式:

public abstract class CLikeSourceReader : ISourceReader
{
    public MetaCode ReadCode(string sourceCode)
    {
        // etc..
    }

    // etc..
}

public abstract class VisualBasicLikeSourceReader : ISourceReader
{
    public MetaCode ReadCode(string sourceCode)
    {
        // etc..
    }

    // etc..
}

public abstract class AssemblyLanguageLikeSourceReader : ISourceReader
{
    public MetaCode ReadCode(string sourceCode)
    {
        // etc..
    }

    // etc..
}

這樣,在添加新語言時,您可以選擇從這些預先存在的基類之一繼承,如果它們都不合適,可以選擇回退到接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM