我如何声明两个 类 以便将它们传递给同一个函数?
How can I declare two classes so they can be passed to the same function?
给定以下两个 classes
public class LocalFoo {
}
public class RemoteFoo {
}
这两个 classes 应该具有相似的属性:
public string strBar{ get; set; }
public int intBar{ get; set; }
不同之处在于程序如何设置和读取这些属性——在前一种情况下,属性是在本地处理的。在后者中,属性是直接从数据库读取和写入的,两个是从数据库读取的 DataTable。
我知道这里必须进行继承,但这正是我遇到困难的地方。
例如,如果我声明一个方法 TakesFoo
:
public void takesFoo( Foo bar ){
/*Magic Happens Here*/
}
我希望能够使用 LocalFoo
或 RemoteFoo
类型的对象调用该方法。
我知道我可以写一篇摘要 class Foo :
public abstract class Foo{
}
并且让 LocalFoo 和 RemoteFoo 都继承自它,但有一个警告 - 我有另一个抽象 class,我需要 RemoteFoo 继承它用于使它更容易 read/write to/from 数据表 -
public abstract class DRHelper : IEquatable<DRHelper>, IDisposable {
}
我最初的直觉是让 Foo 成为一个接口,但我不知道这是否可行,我希望有人能给我一些指导,告诉我应该如何处理这个问题。
创建一个具有以下内容的 IFoo 接口:
string strBar{ get; set; }
int intBar{ get; set; }
class LocalFoo 和 class RemoteFoo 都需要实现 IFoo 接口。
然后将您的方法更改为:
public void takesFoo( IFoo bar ){
/*Magic Happens Here*/
}
我认为,你应该使用 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*/
}
}
给定以下两个 classes
public class LocalFoo {
}
public class RemoteFoo {
}
这两个 classes 应该具有相似的属性:
public string strBar{ get; set; }
public int intBar{ get; set; }
不同之处在于程序如何设置和读取这些属性——在前一种情况下,属性是在本地处理的。在后者中,属性是直接从数据库读取和写入的,两个是从数据库读取的 DataTable。
我知道这里必须进行继承,但这正是我遇到困难的地方。
例如,如果我声明一个方法 TakesFoo
:
public void takesFoo( Foo bar ){
/*Magic Happens Here*/
}
我希望能够使用 LocalFoo
或 RemoteFoo
类型的对象调用该方法。
我知道我可以写一篇摘要 class Foo :
public abstract class Foo{
}
并且让 LocalFoo 和 RemoteFoo 都继承自它,但有一个警告 - 我有另一个抽象 class,我需要 RemoteFoo 继承它用于使它更容易 read/write to/from 数据表 -
public abstract class DRHelper : IEquatable<DRHelper>, IDisposable {
}
我最初的直觉是让 Foo 成为一个接口,但我不知道这是否可行,我希望有人能给我一些指导,告诉我应该如何处理这个问题。
创建一个具有以下内容的 IFoo 接口:
string strBar{ get; set; }
int intBar{ get; set; }
class LocalFoo 和 class RemoteFoo 都需要实现 IFoo 接口。
然后将您的方法更改为:
public void takesFoo( IFoo bar ){
/*Magic Happens Here*/
}
我认为,你应该使用 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*/
}
}