给出以下两个类
public class LocalFoo {
}
public class RemoteFoo {
}
这两个类应该具有类似的属性:
public string strBar{ get; set; }
public int intBar{ get; set; }
不同之处在于如何设置和读取这些属性 - 在前一种情况下,属性由本地处理 - 由程序完成。在后者中,属性直接从数据库中读取和写入两个DataTable读取。
我知道继承必须在这里发生,但这就是我陷入困境的地方。
例如,如果我声明方法TakesFoo
:
public void takesFoo( Foo bar ){
/*Magic Happens Here*/
}
我希望能够使用LocalFoo
或RemoteFoo
类型的对象调用该方法。
我知道我可以写一个抽象类Foo:
public abstract class Foo{
}
并且同时继承了LocalFoo和RemoteFoo,但是有一个警告 - 我有另一个抽象类,我需要RemoteFoo来继承它,这样可以更容易地读取/写入DataTables -
public abstract class DRHelper : IEquatable<DRHelper>, IDisposable {
}
我最初的本能是让Foo成为一个界面,但我不知道这是否会起作用,我希望有人可以就如何处理这个问题给我一些指示。
答案 0 :(得分:9)
创建一个具有以下内容的IFoo接口:
string strBar{ get; set; }
int intBar{ get; set; }
类LocalFoo和类RemoteFoo都需要实现IFoo接口。
然后将您的方法更改为:
public void takesFoo( IFoo bar ){
/*Magic Happens Here*/
}
答案 1 :(得分:-1)
我认为你应该使用Visitor Pattern
它允许您避免if(bar is LocalFoo)
代码。
public abstract class Foo
{
public abstract void Accept(IVisitor visitor);
}
public class LocalFoo : Foo
{
public override void Accept(IVisitor visitor)
{
visitor.Visit(this);
}
}
public class RemoteFoo : Foo
{
public override void Accept(IVisitor visitor)
{
visitor.Visit(this);
}
}
public interface IVisitor
{
void Visit(LocalFoo foo);
void Visit(RemoteFoo foo);
}
public class Visitor : IVisitor
{
public void Visit(RemoteFoo foo)
{
/*Magic Happens Here*/
}
public void Visit(LocalFoo foo)
{
/*Magic Happens Here*/
}
}