类在自身内部的实例
本文关键字:实例 内部 | 更新日期: 2023-09-27 18:19:08
如果我有一个类的公共方法(不是静态的),我不能改变。
我还需要添加一些我自己的方法它们将使用现有的公共非静态方法
我怎样才能用正确的方法做这件事?
现在,在我自己的方法中,我正在创建我自己的类的实例来使用其他方法,但我不认为这是一个好方法。
的例子:
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);
}
}
我认为你的设计不完全正确,但如果你不能改变你的设计,这可能会奏效。虽然我也认为这种工作方式是不正确的。
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();
你所描述的看起来非常像c#的扩展方法。在单独的static
类中定义它们,并像使用实例方法一样使用它们。
听起来你真的希望你的实例方法是静态的;它从一开始就应该是静态的,因为它不依赖于使用对象的任何内部状态(因为您的新方法没有被给定、给出或重用该类型的任何实例)。你不能把它变成静态的,因为有太多的依赖关系在非静态的上下文中使用它。
如果您不能将方法更改为静态,即使它在逻辑上是静态的,那么您的解决方案确实是您在这种情况下所能做的最好的解决方案。它实际上是在非静态方法中创建一个静态"窗口"。
这就是继承变得有用的地方。c#中的语法是:
public class myClass : aaa
{
那么你所要做的就是把你的方法放在这个类中。其他方法也可以。
如果不能更改类,请使用扩展方法。链接
要调用非静态方法,必须具有要调用的实例方法的类的实例。因此,您也不能更改类aaa
,那么您只能使用扩展方法扩展它或从该类继承。下面是扩展方法示例:
public static class MyExtensions
{
public static void x(this aaa myClass)
{
// use public methods of class you are extending
string str = myclass.a(5);
}
}
可以像执行myClass
实例的普通方法一样执行x
方法:
aaa myclass = new aaa();
myClass.x(); // you extension
顺便说一下在c#中我们使用PascalNames作为类和方法
两个选项:
不要写静态方法:
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);
}
扩展方法的确切用例
您需要将行为(新方法)附加到一个封闭类的权利。输入:
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),并使用该对象来实现方法