2014-04-17 138 views
1

所以标题听起来很奇怪,但是(至少我认为有)是我疯狂背后的原因。我想从类中调用接口的方法,而不必创建类的实例;完全像一个静态方法,但我想添加一些我认为的泛型。没有实例的接口方法

interface ISaveMyself 
{ 
    Stream Save(); 

    // If I could force this to be static, it would fix my problem 
    Object Load(MyClass instance); 
} 

class MyClass 
{ 
    #region Implementing ISaveMyself 

    public Stream Save() 
    { 
     Stream stream; 

     // Serialize "this" and write to stream 

     return stream; 
    } 

    // Implements my interface by calling my static method below 
    Object ISaveMyself.Load(Stream stream) 
    { 
     return MyClass.Load(stream); 
    } 

    #endregion Implementing ISaveMyself 

    // Static method in the class because interfaces don't allow static 
    public static Object Load(Stream) 
    { 
     Object currentClass = new MyClass(); 

     // Deserialize the stream and load data into "currentClass" 

     return currentClass; 
    } 
} 

然后,我本来想要做这样的事情称之为:

Type myClassType = typeof(MyClass) 

// This would never work, but is essentially what I want to accomplish 
MyClass loadedClass = (myClassType as ISaveMyself).Load(stream); 

我理解这个问题是多么愚蠢的声音,那是不可能在接口的静态方法。但为了科学和整个社会的熏陶,有没有更好的方法来做到这一点?感谢您的时间和任何建议。

+0

你要求的是奇怪的。如果你能说出你想要解决的实际问题,那对我们来说会更好。实例有什么问题? –

+0

看看[这篇文章](http://stackoverflow.com/questions/259026/why-doesnt-c-sharp-allow-static-methods-to-implement-an-interface) – tophallen

+0

该帖子是完美的。对于接口不允许使用静态方法的原因有着非常广泛的思考。我做了一些研究,但这篇文章胜过它,所以谢谢你! – Dandruff

回答

0

为科学而社会作为一个整体的熏陶,有没有更好的方式来做到这一点?

是的。 分离问题将表明您应该使用可实例化的不同类从流中加载其他类,而不是将多个类用于多种用途。

interface ISaveObjects<T> 
{ 
    Stream Save(T obj); 
} 

interface ILoadObjects<T> 
{ 
    T Load(Stream stream); 
} 

public class MyClassStreamer : ISaveObjects<MyClass>, ILoadObjects<MyClass> 
{ 
    public MyClass Load(Stream stream) 
    { 
     // Deserialize the stream and load data into new instance 
    } 

    public Stream Save(MyClass obj) 
    { 
     Stream stream; 

     // Serialize "obj" and write to stream 

     return stream; 
    } 
} 
+0

是的,我喜欢你的想法。我讨厌将它分离出来并创建一个类来实现所有“MyClass”的Load方法。但我宁愿完成这个项目,然后陷入一个相当平凡的问题。谢谢+编辑:我喜欢那个工厂的想法 – Dandruff

+0

@Dandruff:尽管你讨厌这个想法,但它实际上是一个很好的设计原则。它增加了您在“流”类型之间找到共同点并且能够更好地重用代码的可能性。它减少了你加载/保存对象的方式发生变化的可能性,最终导致你重写一半的代码库。 – StriplingWarrior

+1

其实当你把它放在那个光线下时,它确实有很大的意义......我从来没有必须重写大量的代码,因为我的无知...... _cringe_再次感谢你! – Dandruff

0

我想这样做的唯一方法是继承基类而不是接口选项。喜欢的东西:

public class BaseClass 
{ 
    public static BaseClass NewSelf() 
    { 
     return new BaseClass(); 
    } 
} 

public class TestClass : BaseClass 
{ 

} 

,然后使用它:

TestClass newItem = (TestClass)BaseClass.NewSelf();