如果我有一个既扩展抽象类又实现接口的类,例如:
class Example : AbstractExample, ExampleInterface
{
// class content here
}
我怎样才能初始化这个类,以便我可以从接口和抽象类访问方法?
当我做:
AbstractExample example = new Example();
我无法从界面访问方法。
如果我有一个既扩展抽象类又实现接口的类,例如:
class Example : AbstractExample, ExampleInterface
{
// class content here
}
我怎样才能初始化这个类,以便我可以从接口和抽象类访问方法?
当我做:
AbstractExample example = new Example();
我无法从界面访问方法。
你需要
Example example = new Example();
最后一个示例会将您绑定到接口或抽象类的可靠实例,我认为这不是您的目标。坏消息是您在这里不是使用动态类型的语言,因此您坚持使用对 a 的引用先前指定或铸造/取消铸造的实体“示例”对象,即:
AbstractExample example = new Example();
((IExampleInterface)example).DoSomeMethodDefinedInInterface();
您的其他选择是让 AbstractExample 和 IExampleInterface 都实现一个通用接口,这样您就可以拥有即
abstract class AbstractExample : ICommonInterface
interface IExampleInterface : ICommonInterface
class Example : AbstractExample, IExampleInterface
现在您可以使用 ICommonInterface 并拥有抽象类的功能和 IExample 接口的实现。
如果这些答案都不可接受,您可能需要查看一些在 .NET 框架下运行的 DLR 语言,即 IronPython。
如果您只知道抽象类,则表明您通过Type
. 因此,您可以使用泛型:
private T SomeMethod<T>()
where T : new(), AbstractExample, ExampleInterface
{
T instance = new T();
instance.SomeMethodOnAbstractClass();
instance.SomeMethodOnInterface();
return instance;
}
采用:
Example example = new Example();
更多信息后更新:
如果你确定它实现了 ExampleInterface,你可以使用
AbstractClass example = new Example();
ExampleInterface exampleInterface = (ExampleInterface)example;
exampleInterface.InterfaceMethod();
您还可以通过检查接口来确保它真正实现了它
if (example is ExampleInterface) {
// Cast to ExampleInterface like above and call its methods.
}
我不相信泛型可以帮助你,因为它们是在编译时解决的,如果你只有对 AbstractClass 的引用,编译器会抱怨。
编辑:或多或少是欧文所说的。:)
我认为这个例子会帮助你:
public interface ICrud
{
void Add();
void Update();
void Delete();
void Select();
}
public abstract class CrudBase
{
public void Add()
{
Console.WriteLine("Performing add operation...");
Console.ReadLine();
}
public void Update()
{
Console.WriteLine("Performing update operation...");
Console.ReadLine();
}
public void Delete()
{
Console.WriteLine("Performing delete operation...");
Console.ReadLine();
}
public void Select()
{
Console.WriteLine("Performing select operation...");
Console.ReadLine();
}
}
public class ProcessData : CrudBase, ICrud
{
}
var process = new ProcessData();
process.Add();