我正在开发一个从各种在线档案中删除内容的程序,但我是OOP的新手。我认为最好的方法是拥有一个指定共享变量和方法的父类,然后是每个存档的子类,然后包含从该特定站点获取信息的特定方法,例如GrabStoryVariables()每个子类以满足该存档的个别需求。该程序在文本框中获取一个URL,然后从那里它将确定使用哪个子类实例化的URL。
我遇到的问题是弄清楚如何创建子类对象并让它可以访问整个程序。例如,要创建FanFictionAuthors的实例:FanBook:
private void btnGetInfo(object sender, EventArgs e)
{
CreateBook();
}
private void CreateBook()
{
if (addressBar.Text.Contains("fanficauthors.net"))
{
FanFictionAuthors myBook = new FanFictionAuthors();
}
return;
}
myBook的范围只是CreateBook()函数,所以这种方法不会起作用。有关处理此问题的最佳方法的任何建议吗?我正在使用它作为一种更好地学习编程的方法,所以“正确”的方式是我想要弄清楚的,不管是什么。
编辑:该程序的具体功能是从fanfiction.net,fictionpress.com或任意数量的其他在线故事档案中获取在线故事的提供URL。每个故事都有一组共享属性,例如标题,章节数,单词长度,章节标题以及故事的实际内容。该程序编译所有这些来创建一个单独的html文档(后来扩展为允许不同的电子书格式)而不是一堆小的单个章节文件。
考虑到这一点,每个存档之间应该有所不同的部分是从特定存档中获取变量的方法,以及如何根据存档的功能在章节之间进行迭代。
目前我正在做的只是在启动主窗体时立即创建myBook对象,然后为获取变量并执行迭代的函数创建不同的方法名称。然而,随着我添加更多档案,这变得更加复杂。我最初想做的是将myBook转换为各个归档类型(本例中为FanFictionAuthors)以获取使用其特定功能的能力。从在线看,看起来从父母到孩子的铸造并不容易,也不推荐,所以我不确定如何处理这个问题。
这是该项目的GitHub链接。此版本略有过时,但让您了解我目前是如何接近此版本的:https://github.com/benroth/fBook
答案 0 :(得分:1)
创建一个超类,其中包含常用属性和方法:
public class FanBook
{
// use a common constructor
public FanBook(string url)
{
grabHtml(url);
// ...
}
protected string grabHtml(string address) { // SNIP }
protected void CreateStoryHeader() { // SNIP }
// other common methods which are the same for every subclass (maybe BuildToc, GetStory, etc.)
// maybe if you want some easy access to attributes, you could add a dictionary
public void Dictionary<string, string> Attributes;
// Then use abstract methods to define methods that are different for subclasses
protected abstract void GrabStoryVariables();
protected abstract void GenerateStoryInfo();
}
然后创建一个派生自Book
:
public class FFNETBook : FanBook {
// FFNETBook constructor to call contructor from FanBook too
public FFNETBook(string url) : FanBook(url) {
// specific initializations for FFNET
}
public override void GrabStoryVariables() { // special implementation for FFNET here }
public override void GenerateStoryInfo() { // special implementation for FFNET here }
}
我知道当你没有太多经验时,很难掌握OOP。所以随时提问。 如果你做得对,那么你永远不需要转换为子类。
回答评论中的问题:
您可以在form1.cs
文件中创建一个类变量:
private FanBook currentBook;
private void CreateBook()
{
currentBook = new FFNETFanBook("http://...");
}
private void AnotherMethod() {
if ( currentBook != null ) {
currentBook.GrabStoryVariables();
} else {
throw new Exception("Book not initialized yet.");
}
}
答案 1 :(得分:1)
实现名为IAuthors的接口并定义您想要的方法
Interface IAuthors
{
//method
void authorMethod();
}
在各个类中实现接口
Public Class FanFictionAuthors:IAuthors
{
public void authorMethod()
{
//fanfiction specific action
}
}
Public class SciFiAuthors:IAuthors
{
public void authorMethod()
{
//scifiauthor specific action
}
}
现在在现有代码中进行以下更改
private void btnGetInfo(object sender, EventArgs e)
{
IAuthors auth=CreateBook();//Use a Interface ref
auth.authorMethod();//Runtime will decide which authorMethod to call depending
//on the object returned.
}
//Note that i am returning the Interface type instead of the void
private IAuthors CreateBook()
{
if (addressBar.Text.Contains("fanficauthors.net"))
{
return new FanFictionAuthors();//Return your object
}elseif(addressBar.Text.Contains("scificauthors.net"))
{
return new SciFiAuthors();//Return your object
}
}
答案 2 :(得分:0)
您可以在父级中创建一个列表,并将子级添加到该列表中。然后你可以走一下这个列表,看看孩子是否已经完成等等。
ChildList.Add(new fan....)