5

我是使用接口的新手,所以我有一个问题对你们大多数人来说可能很容易。

我目前正在尝试为 Windows 窗体制作界面。它看起来像

interface myInterface
{
    //stuff stuff stuff
}

public partial class myClass : Form, myInterface
{
   //More stuff stuff stuff. This is the form
}

当我尝试实现它时,问题就来了。如果我用

myInterface blah = new myClass();
blah.ShowDialog();

ShowDialog() 函数现在可供它使用。这是有道理的 - myInterface 是一个界面,而不是一个表单......但我很好奇我应该如何使用 Windows 表单来实现该界面,或者它是否甚至是一个可行的选择。

有人对我应该如何去做有任何建议吗?

谢谢!

4

4 回答 4

2

解决此问题的一种方法是将 ShowDialog 添加到 myInterface:

 interface myInterface
 {
     DialogResult ShowDialog();
 }

现在,您可以在接口上调用该方法而无需强制转换。

如果你想更喜欢它,你可以创建另一个代表任何对话框的界面......

interface IDialog
{
     DialogResult ShowDialog();
}

然后让你的其他接口实现 IDialog:

interface myInterface : IDialog
{
     //stuff stuff stuff
}

这具有可能重用更多代码的优势......您可以拥有接受 IDialog 类型参数的方法,并且它们不必了解 myInterface。如果您为所有对话框实现了一个通用的基本接口,您可以以相同的方式处理:

void DialogHelperMethod(IDialog dialog)
{
     dialog.ShowDialog();
}

myInterface foo = new myClass();
DialogHelperMethod(foo);
于 2013-08-13T12:49:20.643 回答
2
interface MyInterface
{
    void Foo();
}

public partial class MyClass : Form, MyInterface
{
   //More stuff stuff stuff. This is the form
}

Form f = new MyClass();
f.ShowDialog(); // Works because MyClass implements Form
f.Foo(); // Works because MyClass implements MyInterface
于 2013-08-13T12:55:59.387 回答
1

这似乎是一个关于如何正确公开类成员的问题。

internal - Access to a method/class is restricted to the application
public - Access is not restricted
private - Access is restricted to the current class (methods)
protected - Access is restricted to the current class and its inherited classes

接口的一个示例使用是在类之间共享公共方法签名

interface IAnimal
{
    int FeetCount();
}
public class Dog : IAnimal
{
    int FeetCount()
    {
    }
}

public class Duck : IAnimal
{
    int FeetCount()
    {
    }
}
于 2013-08-13T13:12:03.587 回答
0

您只能访问您用来保存 myClass 的类型所公开的项目。例如,

Form f = new MyClass();
f.ShowDialog();  // Will work because f is of type Form, which has a ShowDialog method
f.stuff(); // Works because MyClass implements myInterface which exposes stuff()

您想要的所有东西都在那里,但您必须以不同于您尝试的方式引用它们。

于 2013-08-13T12:45:41.653 回答