[英]Inheritance and classes within classes
这是一些伪代码来说明我在看什么。
public class Loader
{
public Execute()
{
var currentPage = new ItemPageDocumentBuilder();
while(reader.Read())
{
currentPage.Add(reader.XmlDoc);
}
}
private class ItemsToLoad
{
private XmlDocument _page
public void Add(XmlElement itemelement)
{
_page.DocumentElement.AppendChild(itemElement);
}
}
}
我需要从Loader派生一个类,然后重写其中的ItemsToLoad类的Add方法,然后调用base.Execute()。 换句话说,我希望派生类的Execute()方法与Loader完全相同,但是要使用ItemsToLoad的重写Add方法来工作。
我怀疑最简单的方法是从Loader中删除ItemsToLoad,并使其抽象化,对吗?
如果出于兴趣我不能这样做,最好的解决方案是什么?
如果我理解您的要求,则您有两个责任:执行某些操作(始终相同)和添加某些内容(不同)。
如果没有继承和内部类,我会做得多简单。
对于添加任务,您定义一个接口:
public interface IItemAdder
{
void Add();
}
还有一个或多个实现:
public class ItemAdder1 : IItemAdder
{
public void Add()
{
// specific implementation here
}
}
然后,您有一个加载器,在其中加载了项添加器的特定实例:
public class Loader : ILoader
{
private IItemAdder _itemAdder;
public Loader(IItemAdder itemAdder)
{
_itemAdder = itemAdder;
}
public void Execute()
{
// use injected item adder to do work
_itemAdder.Add();
}
}
public interface ILoader
{
void Execute();
}
因此用法是:
var loader = new Loader(new ItemAdder1());
loader.Execute();
这样,一切都可以注入,可以轻松地替换和嘲笑; 并且您清楚地将关注点分开。
这是一个建议(语法可能不正确):
public class Loader
{
ItemsToLoad item;
public Loader(ItemsToLoad item) {
this.item = item;
}
public Execute()
{
// do things using item like item.add();
}
}
interface ItemsToLoad
{
void add();
}
class ItemsToLoad1: ItemsToLoad
{
void add(){
// implementation
}
}
class ItemsToLoad2: ItemsToLoad
{
void add(){
// implementation
}
}
这里是如何使用它们;
ItemsToLoad item;
if (some condition) {
item = new ItemsToLoad1()
} else {
item = new ItemsToLoad2()
}
Loader loader = new Loader(item);
loader.execute();
您可以继承两个类,并将子子类对象注入其父类。
class Loader
{
public void Execute(ItemsToLoad argObj)
{
if(argObj == null)
argObj = new ItemsToLoad();
argObj.Add(19);
}
public class ItemsToLoad
{
public virtual void Add(int a)
{
Console.WriteLine("Reached ItemsToLoad.");
}
}
}
class ChildLoader:Loader
{
public void Execute(ItemsToLoad argObjLoader)
{
if (argObjLoader == null)
argObjLoader = new ChildItemsToLoad();
base.Execute(argObjLoader);
}
class ChildItemsToLoad : Loader.ItemsToLoad
{
public override void Add(int b)
{
Console.WriteLine("Reached ChildItemsToLoad.");
}
}
}
并且可以开始于
ChildLoader obj999 = new ChildLoader();
obj999.Execute(null);
我需要从Loader派生一个类,然后重写其中的ItemsToLoad类的Add方法,然后调用base.Execute()。 换句话说,我希望派生类的Execute()方法与Loader完全相同,但是要使用ItemsToLoad的重写Add方法来工作。
您需要覆盖Loader
,而不是ItemsToLoad
。 您尚未显示使用ItemsToLoad
的代码,因此很难具体说明-但至少,您需要重写new ItemsToLoad
来指向您的子类。 另外, ItemsToLoad
是私有的-这意味着您只能在Loader
使用它。 现在,您需要完全重写的ItemsToLoad
并覆盖Loader
中使用ItemsToLoad
每个方法。
如果控制Loader
类,最简单的更改可能是抽象出ItemsToLoad
的创建并打开ItemsToLoad
以便可以将其子类化。 就像是:
public class Loader {
private ItemsToLoad Items { get; set; }
protected virtual ItemsToLoad CreateItemsToLoad() {
return new ItemsToLoad();
}
protected class ItemsToLoad {
public virtual void Add() {
}
}
}
public class MyOtherLoader : Loader {
protected override ItemsToLoad CreateItemsToLoad() {
return new MyOtherItemsToLoad();
}
private class MyOtherItemsToLoad : ItemsToLoad {
public override void Add() {
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.