【问题标题】:How to I implement this Base/Derived class structure?如何实现这个 Base/Derived 类结构?
【发布时间】:2011-09-21 18:56:31
【问题描述】:

我正在编写一个 C# 应用程序,它读取语言 X 的源代码文件,并使用出现在源文件中的类、方法等填充数据结构。

之后,使用我刚刚填充的这个数据结构,我可以调用以下三个函数中的任何一个:

GenerateCS()
GenerateJava()
GenerateCPP()

基本上,它将语言 X 移植到这三种语言中的任何一种。

我的问题是,我如何构造它,以便我有一个类 GenerateCode 作为基类,而其他生成函数从它派生? 我想每种语言的特定语法细节都必须驻留在派生类本身中,但是我可以将什么东西抽象到超类中呢?

【问题讨论】:

  • GenerateCode() 对我来说似乎是一种方法......

标签: c# oop


【解决方案1】:

怎么样:

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);
}

【讨论】:

  • 谢谢。接口会更适合这样的应用程序吗?
  • @xbonez:好吧,如果您想导出 不同项目中的行为,或者您需要使其真正通用和可扩展,则可能需要一个接口。如果您的工作在同一个项目中并且您使用的课​​程是有限的,恕我直言,您不需要它。无论如何,请记住重要的区别:一个类可以实现多个接口,但只能从一个类继承!!
【解决方案2】:

我建议你从这样的结构开始:

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..
}

这样,在添加新语言时,您可以选择从这些预先存在的基类之一继承,如果它们都不适合,则可以选择回退到接口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    相关资源
    最近更新 更多