[英]Base class does not implement INotifyPropertyChange; how do I implement it in derived class?
[英]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.