2009-04-25 152 views
4

如果我有两个扩展一个抽象类,实现了一个接口,例如一类:类都扩展一个抽象类,实现了接口

class Example : AbstractExample, ExampleInterface 
{ 
    // class content here 
} 

我怎么能初始化这个类,所以我可以访问来自接口和抽象类的方法?

当我这样做:

AbstractExample example = new Example(); 

我无法访问从接口的方法。

回答

5

的最后一个例子将配合你无论是接口或抽象类,我相信了坚实的实例是不是你goal.The坏消息是你在一个动态的不是类型化的语言在这里,所以你坚持了既具有坚实的“示例”对象的引用,以前sprcified或铸造/ uncasting即:

AbstractExample example = new Example(); 
((IExampleInterface)example).DoSomeMethodDefinedInInterface(); 

您的其他alternitives是同时拥有AbstractExample和I​​ExampleInterface实现一个共同的接口,这样你会有,即

abstract class AbstractExample : ICommonInterface 
interface IExampleInterface : ICommonInterface 
class Example : AbstractExample, IExampleInterface 

现在您可以使用ICommonInterface并具有抽象类和IExample接口实现的功能。

如果这些答案都不可接受,那么您可能需要查看一些在.NET框架下运行的DLR语言,即IronPython。

+0

谢谢你的两个答案都非常有用;) 我对C#有点困惑,因为我来自PHP/Zend,它的语言非常不同。 – 2009-04-25 19:08:44

+0

是的,我认为很多人也来自这个背景(包括我在内)。您可以使用静态语言进行操作,反之亦然。要做的最好的事情就是了解差异,看看线条可以略微模糊。 .NET 3.5引入了一些强大的功能,使语言变得“充满活力”,Kent Boogaart的解决方案是一个很好的开始,可能在没有额外界面的冗长的情况下获得您需要的功能。 – Owen 2009-04-25 19:13:21

1

用途:

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,编译器会抱怨。

编辑:或多或少欧文说。 :)

+0

谢谢。 但是如果我不知道对类的引用,我只知道它扩展了哪个抽象类以及它实现了哪个接口? Richard – 2009-04-25 18:55:31

10

您需要

  • 实现该接口在AbstractExample
  • 或得到例

Example example = new Example();

5

的引用。如果你只知道抽象类,它建议你通过Type的实例知道实际的类型。因此,你可以使用泛型:

private T SomeMethod<T>() 
    where T : new(), AbstractExample, ExampleInterface 
{ 
    T instance = new T(); 
    instance.SomeMethodOnAbstractClass(); 
    instance.SomeMethodOnInterface(); 
    return instance; 
} 
+0

真的很喜欢这个答案,现在你已经开始思考如何进一步采用这个解决方案了。 – Owen 2009-04-25 19:08:57

1

我觉得这个例子可以帮助你:

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(); 
相关问题