我有两个类A和B,两个类都实现了接口ISomeInterface。但是A和B类都不需要某些属性。
但是在客户端应用程序中,我正在调用相同的ISomeInterface来调用这两个类。我遇到的问题是我不想在同一界面中使用Dictionary<string, string>
和TypedDataSet,IList<Record>
属性。但是客户端需要使用此IsomeInterface。
实际上,DataValues()属性仅适用于A类。
同样,MetaData()和RecordCollection()属性适用于类B。
另外,如果我将来引入一个新的C类,并且需要这样的单独属性,那么我的代码将看起来很丑陋,这是我所不希望的。
因此,有什么办法可以让我仍然在客户端应用程序中使用相同的IsomeInterface并在相应的类中具有适当的属性?
我认为我需要使用“策略设计”模式,但对如何实现相同的模式感到困惑。如果我错了,请纠正我吗?
见下文:
interface ISomeInterface
{
string Id{get; set;}
void Display();
Dictionary<string, string> DataValues{get;};
TypedDataSet MetaData{get; }
IList<Record> RecordCollection{get; }
}
public class A: ISomeInterface
{
public string Id
{
return "A1";
}
void Display()
{
Console.Writeline("class A");
}
public Dictionary<string, string> DataValues()
{
return new Dictionary<string, string>();
}
public TypedDataSet MetaData()
{
//I dont want this method for class A
throw new NotImplementedException();
}
public IList<Record> RecordCollection()
{
//I dont want this method for class A
throw new NotImplementedException();
}
}
public class B: ISomeInterface
{
public string Id
{
return "B1";
}
void Display()
{
Console.Writeline("class B");
}
public Dictionary<string, string> DataValues()
{
//I dont want this method for class B
throw new NotImplementedException();
}
public TypedDataSet MetaData()
{
return new TypedDataSet();
}
public IList<Record> RecordCollection()
{
IList<Record> rc = null;
//do something
return rc;
}
}
客户端应用-
Main()
{
ISomeInterface a = new A();
a.Display();
Dictionary<string, string> data = a.DataValues();
ISomeInterface b = new B();
b.Display();
TypedDataSet data = b.MetaData();
IList<Record> rc = b.RecordCollection();
}
最佳答案
在这种情况下,策略实际上对您不起作用。
我们必须质疑,当ISomeInterface的实现类不支持所有方法时,为什么必须调用它。最好有几个继承接口。
ISome接口
IClassA接口
IClassB接口
然后,选择最适合使用的接口。
interface ISomeInterface
{
string Id{get; set;}
void Display();
}
interface IClassAInterface
{
Dictionary<string, string> DataValues{get;};
}
interface IClassBInterface
{
TypedDataSet MetaData{get; }
IList<Record> RecordCollection{get; }
}
您给出的示例用法并没有真正的帮助-您已经知道要实例化哪个类(新A()和新B()),因此接口不会为您提供任何附加的抽象。因此,让我们考虑一个示例,其中该技术更有用:
public class SomeCollection
{
public ICollection<T> retrieveItems<T>() where T : ISomeInterface
{
//... retrieve relevant instances.
}
}
然后
var col = new SomeCollection();
// Populate...
var someInterfaces = col.retrieveItems<ISomeInterface>();
foreach(ISomeInterface instance in someInterfaces){
instance.Display();
}
var classAInterfaces = col.retrieveItems<IClassAInterface>();
// etc.
因此,我想最后,如果您想从As和B的集合中获取一堆“ RecordCollection”,则确实需要重新考虑您的设计。