如何声明两个类,以便它们可以传递给同一个函数?

时间:2016-02-15 16:43:10

标签: c# inheritance abstract-class

给出以下两个类

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*/
}

我希望能够使用LocalFooRemoteFoo类型的对象调用该方法。

我知道我可以写一个抽象类Foo:

public abstract class Foo{
}

并且同时继承了LocalFoo和RemoteFoo,但是有一个警告 - 我有另一个抽象类,我需要RemoteFoo来继承它,这样可以更容易地读取/写入DataTables -

public abstract class DRHelper : IEquatable<DRHelper>, IDisposable {
}

我最初的本能是让Foo成为一个界面,但我不知道这是否会起作用,我希望有人可以就如何处理这个问题给我一些指示。

2 个答案:

答案 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*/
        }
    }