【发布时间】:2016-03-03 16:23:15
【问题描述】:
这里是 OOP 的新手。我用一种方法定义了一个接口,并在我的派生类中定义了另一种公共方法。我的客户端代码有条件地实例化一个接口类型的类,当然编译器不知道其中一个派生类中的方法,因为它不是底层接口定义的一部分。这就是我要说的:
public interface IFileLoader
{
public bool Load();
}
public class FileLoaderA : IFileLoader
{
public bool Load();
//implementation
public void SetStatus(FileLoadStatus status)
{
//implementation
}
}
public class FileLoaderB : IFileLoader
{
public bool Load();
//implementation
//note B does not have a SetStatus method
}
public enum FileLoadStatus
{
Started,
Done,
Error
}
// client code
IFileLoader loader;
if (Config.UseMethodA)
{
loader = new FileLoaderA();
}
else
{
loader = new FileLoaderB();
}
//does not know about this method
loader.SetStatus (FileStatus.Done);
我想我有两个问题:
我应该怎么做才能确定在运行时创建的对象是否具有我尝试使用的方法?还是我的方法不对?
我知道人们一直在谈论 IOC/DI。作为新的 OOP,使用 IOC 有什么好处可以说,“当我的应用程序询问 对于 IFileLoader 类型,使用具体类 x",而不是简单地 使用 App.Config 文件获取设置?
【问题讨论】:
-
您必须将 loader 转换为具有额外方法的类型才能调用方法,例如 ((FileLoaderA)loader).SetStatus(FileStatus.Done);
-
如果你需要测试你是否可以先使用 if((loader as FileLoaderA) != null)
-
决定把上面的cmets放在一个答案里。
-
为什么不在
Load方法的末尾加上FileLoaderA调用SetStatus?
标签: c# oop ioc-container