如果我有一个公共方法(非静态)的课程,我无法改变 我需要添加一些自己的方法来使用现有的公共非静态方法,
我怎么能以正确的方式做到这一点?
现在,在我自己的方法中,我正在创建一个我自己的类的实例来使用其他方法,但我不认为这是一个好方法。
示例:
class aaa
{
public string a(int i)
{
...
}
public string b (int i)
{
...
}
public static void x()
{
aaa myclass = new aaa();
string str = myclass.a(5);
}
}
答案 0 :(得分:3)
我认为你的设计并不完全正确,但如果你不能改变你的设计,这可能会有所帮助。虽然我也认为这种工作方式不正确。
public class MyClass
{
public string MethodA(int i)
{
return StaticMethodA(i);
}
private static string StaticMethodA(int i)
{
return String.Format("i is {0}", i);
}
public static void MethodX()
{
string str = StaticMethodA(5);
}
}
现在你可以做到:
MyClass mc = new MyClass();
string str = mc.MethodA(3);
//or
MyClass.MethodX();
答案 1 :(得分:2)
您所描述的内容与C#的extension methods非常相似。在单独的static
类中定义它们,并将它们用作实例方法。
答案 2 :(得分:1)
听起来你真的希望你的实例方法是静态的;它应该从一开始就是静态的,因为它不依赖于使用对象的任何内部状态(因为没有给出新方法,给予或重新使用该类型的任何实例)。您无法进行重大更改以使其成为静态,因为在非静态上下文中使用它的依赖性太多。
如果您无法将方法更改为静态,即使它在逻辑上是,您的解决方案确实是您在这种情况下可以做的最好的方法。它实质上是在非静态方法中创建一个静态“窗口”。
答案 3 :(得分:0)
要调用非静态方法,必须具有类的实例,您要调用哪种实例方法。因此,您无法更改类aaa
,那么您只能使用extension methods扩展它或从该类继承。这是扩展方法示例:
public static class MyExtensions
{
public static void x(this aaa myClass)
{
// use public methods of class you are extending
string str = myclass.a(5);
}
}
您可以像x
实例的常规方法一样执行myClass
方法:
aaa myclass = new aaa();
myClass.x(); // you extension
C#中的 BTW 我们将PascalNames用于类和方法。
答案 4 :(得分:0)
这是继承变得有用的地方。 c#中的语法是:
public class myClass : aaa
{
然后你要做的就是把你的方法放在这个课程中。其他方法也可以。
答案 5 :(得分:0)
如果无法更改类使用扩展方法。 link
答案 6 :(得分:0)
两个选项:
不要编写静态方法:
class Other {
private aaa _MyClass = new aaa();
public void x() {
string str = _MyClass.a(5);
}
}
将aaa声明为静态实例:
static aaa s_MyClass = new aaa();
public static void x() {
string str = s_MyClass.a(5);
}
答案 7 :(得分:0)
扩展方法的确切用例imho。
您需要将行为(新方法)附加到封闭类权限。所以,去吧:
class aaa
{
public string a(int i)
{
...
}
public string b (int i)
{
...
}
}
static class ExtensionContainer
{
public static void x(this aaa myclass)
{
string str = myclass.a(5);
}
}
扩展方法可以像实例方法一样调用,因此调用者提供了您需要使用的函数所需的对象。
如果你确实要求新方法是静态的 - 这只是一个巨大的代码味道。静态方法更接近纯函数 - 并使用内部有状态对象来实现?
如果它不是一个糟糕的设计标志,我不知道这个问题,只需要制作一个单独的类(aaa)并使用该对象来实现该方法。