首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

[]怎么实现类的不同构造函数拥有不同的方法.

2012-03-19 
[求助]如何实现类的不同构造函数拥有不同的方法.我的问题是:比如:publicclassa{privateint_Id//构造函数p

[求助]如何实现类的不同构造函数拥有不同的方法.
我的问题是:
比如:
public   class   a
{
    private   int   _Id;
   
    //构造函数
    public   a()
    {
 
    }

    public   a(int   paramInt)
    {
        this._Id=paramInt
    }
   
    public   int   UpDate()
    {
        //其他代码
        /*我的目的:我想在使用这个类的时候,a=new   a();这个时候只能使用Update()这个方法,而下面这个Delete()方法不能使用.(最好是在a点的时候智能提示不显示Delete()这个方法.*/
    }
    public   int   Delete()
    {
  //其他代码
        /*我的目的:我想在使用这个类的时候,a=new   a(1);这个时候只能使用Delete()
这个方法,而上面那个UpDate()方法不能使用.(最好是在a点的时候智能提示不显示UpDate()这个方法.*/

    }
}


简单的说:
就是:
如果使用a=new   a()实例化的时候,只能使用UpDate()方法(最好是在a点的时候智能提示不显示Delete()这个方法).

如果使用a=new a(1)实例化的时候,只能使用Delete()方法(最好是在a点的时候智能提示不显示UpDate()这个方法).

不知道可以实现不呢?

请各位大哥大姐帮帮忙,3Q!

[解决办法]
构造函数重载
通过设置不同参数对构造函数重载
比如public a()
{}
也可以
public a(string str1)
{}
还可以public a(string str1, int i)
{}
etc..
[解决办法]
-_-#
[解决办法]
先想想,貌似不行的
[解决办法]
先帮你顶一下,最好给我点分!呵呵!
[解决办法]
曲线救国


public class A
{
private int _Id;
private A _A = null;

public A()
{
_A = new A1();
}

public A(int paramInt)
{
this._Id = paramInt;
_A = new A2(paramInt);
}

public int UpDate()
{
if (_A is A2)
{
throw new Exception( "Update方法不能用 ");
}
}

public int Delete()
{
if (_A is A1)
{
throw new Exception( "Delete方法不能用 ");
}
}
}

public class A1 : A
{
}

public class A2 : A
{
}

[解决办法]
我觉得不行
[解决办法]
建议你写两个类,如果是自己使用的话应该明白其中的意思,所以不用你说的条件
[解决办法]
为什么不派生出两个类;
一个构造函数继承A(),实现Update()方法;
另一个构造函数继承A(int a),实现Delete()方法;
[解决办法]
建不同的类,属于不同的类中 ^-^
^-^
^-^
[解决办法]
有点工厂和单件的味道。
[解决办法]
你可以用接口来完成,注意要避开从constructor来控制,大致的思路如下:
public interface IUpdate
{
int Update();
}

public interface IDelete
{
int Delete();
}

public class a:IUpdate, IDelete
{
private a(){}
private a( int paramInt ){
...


}
public int Update()
{
//implement update method
}
public int Delete()
{
//implement delete method
}

public static IUpdate Create()
{
return new a();
}
public static IDelete Create( int paramInt )
{
return new a( paramInt );
}

}
[解决办法]
全文精典,顶死楼上
[解决办法]
学习~~
[解决办法]
用继承没啥重复的工作量吧?重复的部分都写在基类里就行了。
[解决办法]
冒昧问下:

最好是在a点的时候智能提示不显示Delete()这个方法

是什么意思?
[解决办法]
有趣的问题,关注一下
[解决办法]
愚翁大哥的方法是王道。。。
顶你,学习中
[解决办法]
关注,帮顶.就用接口的方法实现
[解决办法]
1。
基本就是 mapserver 的方法,运行时判断

2。
有点工厂和单件的味道。
======
哪里嗅到的 Singleton 味道 ????

3。
实际就是有这种需求的类,
比如我们看看 .net 关于 XML DOM 的一个继承层次:

System.Xml.XmlNode 表示 XML 文档中的单个节点。
System.Xml.XmlAttribute 表示一个属性。此属性的有效值和默认值在文档类型定义 (DTD) 或架构中进行定义。
System.Xml.XmlDocument 表示 XML 文档。
System.Xml.XmlDocumentFragment 表示对树插入操作有用的轻量对象。
System.Xml.XmlEntity 表示实体声明,例如 <!ENTITY... > .
System.Xml.XmlLinkedNode 获取紧靠该节点(之前或之后)的节点。
System.Xml.XmlNotation 表示一个表示法声明,例如 <!NOTATION... > .

如果你经常操作 XML, 那么你就知道虽然他们都继承自 XmlNode,而且也就具有同样的方法,但是并不时所有的基类 XmlNode 中的方法在子类中得到支持,
上面的子类有一个枚举类型与他们对应 System.Xml.XmlNodeType,
比如 XmlNode.Value 属性,对于 System.Xml.XmlDocume.XmlDocument 类型(作为文档树的根的文档对象)的节点,即System.Xml.XmlDocumenet.Value 实际上是不具有 Value 属性,当然当你调用此属性的时候,他不是丢出异常,而是返回一个 null (空引用)

与此同时,假如你用过 XmlReader 类,那么 XmlReader 中的相关方法也需具体的那种类型的XmlNode 有关系

因此,我给 LZ 的建议是如果你通过标志符,还区别不用的子类,那么选择 System.Xml.XmlNode 这样继承层次设计,并提供嘎一个表示你的子类类型的枚举类型

4。
.net 类库中还有一个与此主题比较相关,值得大家研究的设计:可写集合与只读集合的设计

我在另一帖中,对以下四个类做了简单的讨论了
ArrayList 与 ReadOnlyArrayList
LIst <T> 与 ReadOnlyCollection <T>

http://community.csdn.net/Expert/TopicView3.asp?id=5649526

感兴趣的朋友,继续添砖加瓦 :D

6。
事实上,
Knight94(愚翁) 的方法就是工厂模式, System.Xml.XmlNode 的实现层次中,除了 XmlDocument 可以 new 意外,你是无法实例化任意一个子类的,其他子类 均通过 XmlDocument.CreateXXXX 方法来创建

我们可以肯定的是,通过接口分离,以更好的实现面向接口编程,是最佳的方式。

然而,Knight94(愚翁) 提供的场景比没有达到 LZ 的初衷,因为 LZ 实际上想要实现的是,
类A,类B实现一个接口I,接口I同时具有一组规约方法集合,如方法 Foo1, Foo2,Foo3,
但是由于现实世界中的某种约束,类的设计者,只希望 类A 支持 Foo1 和 Foo3,而类B,支持
Foo2 和 Foo3。那么,类A 和 类B 还是各自实现了 Foo2 和 Foo1,只是,显示的一个无效的方法,.net 中就是直接 throw new NotSUpportedException。
当然,你会说,那我将接口 I,在分析细化,是的,你可以!但,这会出现一个交叉的情况,我没有想到更好的设计方案。

我们看看我们很熟悉的可写集合ArrayList 与 只读集合 ReadOnlyArrayList(后者你可能不熟悉,因为它是定义为 ArrayList 的一个私有的内嵌类),
想想, ArrayList 和 ReadOnlyArrayList 是不是都是属于类 “List”子类(表示元素个数可变数组) 呢?他们均实现了 IList 接口, 而接口 Ilist 中即定义一组操作列表集合的方法集,但是做为类的设计者,你希望只有 ArrayLIst 的消费者可以使用 ILIst 的所有方法,但是
ReadOnlyArrayList 的消费者,一旦实例化之后,只能允许他消费“读”的方法,如 this 索引器的 get 访问器,但是不能调用 Add Remove 等方法。
当你调用ReadOnlyArrayList.Add 方法时候,会丢出 NotSupportedException 异常。

具体实现时,为了提高复用,ReadOnlyArrayList 直接 ArrayList,重写 Add Remove 等方法

7。
.net 中有很多设计策略,设计模式,值得我们学习。
还有很多,有时间可以去挖掘,
再如,与6中对应的泛型版本 List <T> 和 ReadOnlyCollection <T> ,后者采取了显示接口的实现方式,因为显示接口具有“私有实现”的优点,如果你不将ReadOnlyCollection <T> 强制转化为 ICollection <T> 接口 时无法调用 Add方法,当然即使你调用了也是白搭 :D……不支持



关于设计模式,实现太多了,没有时间也就没有系统的研究,有兴趣大家再讨论了。

8
不断参与实践,不断提升自己


Good Luck!

[解决办法]
使用接口工厂来实现,演示示例
---------------------------------------------------
/// <summary>
/// 接口声明
/// </summary>
public interface IGoods
{
int Id
{
get;
set;
}
}

/// <summary>
/// 第一个演示类
/// </summary>
public class GoodsOne : IGoods
{
public GoodsOne()
{
}
#region IGoods 成员
private int _Id = 0;
public int Id
{
get
{
// TODO: 添加 GoodsOne.Id getter 实现
return _Id;
}
set
{
// TODO: 添加 GoodsTwo.Id setter 实现
_Id = value;
}
}
#endregion

/// <summary>
/// 方法
/// </summary>
public int Update()
{
//具体的操作
}
}

/// <summary>
/// 第二个演示类
/// </summary>
public class GoodsTwo : IGoods
{
public GoodsTwo()
{
}

#region IGoods 成员
private int _Id = 0;
public int Id
{
get
{
// TODO: 添加 GoodsOne.Id getter 实现
return _Id;
}
set
{
// TODO: 添加 GoodsTwo.Id setter 实现
_Id = value;
}
}
#endregion

/// <summary>
/// 方法
/// </summary>
/// <returns> </returns>
public int Delete()
{
//具体的操作
}
}


/// <summary>
/// 实物工厂
/// </summary>
public class GoodsFactory
{
private GoodsFactory(){}

public static IGoods Create()
{
return new GoodsOne();
}

public static IGoods Create(int id)
{
IGoods g = new GoodsTwo();
g.Id = id;
return g;
}
}

/// <summary>
/// 演示
/// </summary>
public class GoodsTest
{
public GoodsTest()
{
GoodsOne one = GoodsFactory.Create() as GoodsOne;
one.Update();

GoodsTwo two = GoodsFactory.Create(1) as GoodsTwo;
two.Delete();
}
}
[解决办法]
严重同意中间楼的,用接口实现~
[解决办法]
to: kingthy() ( )
你这样,其实就是分了两个类,不用接口这么麻烦吧,
如下也一样
/// <summary>
/// 接口声明
/// </summary>
public class BaseGoods
{
#region 成员
private int m_nId = 0;
public int Id
{
get{return m_nId;}
set{m_nId = value;}
}
#endregion
}

/// <summary>
/// 第一个演示类
/// </summary>
public class GoodsOne : BaseGoods
{
public GoodsOne()
{
}

public int Update()
{
}
}

/// <summary>
/// 第二个演示类
/// </summary>
public class GoodsTwo : BaseGoods
{
public GoodsTwo(id)
{
m_nId = id;
}

public int Delete()
{
}
}

/// <summary>
/// 实物工厂
/// </summary>
public class GoodsFactory
{
private GoodsFactory(){}

public static GoodsOne Create()
{
return new GoodsOne();
}



public static GoodsTwo Create(int id)
{
return new GoodsTwo(id);
}
}

/// <summary>
/// 演示
/// </summary>
public class GoodsTest
{
public GoodsTest()
{
GoodsOne one = GoodsFactory.Create() ;
one.Update();

GoodsTwo two = GoodsFactory.Create(1);
two.Delete();
}
}
[解决办法]
如果用接口实现为什么就定义两个类??一个类只有update方法,一个类只有delete方法,而且这样还简但些.

[解决办法]
要实现这样的要求貌似不行,实例化过程是运行时行为,在写代码的时候是无法通过实例化参数确定哪个方法可见,哪个方法不可见的.在方法前可以加
[EditorBrowsable(ComponentModel.EditorBrowsableState.Never)]
但这只支持常量.
[解决办法]
不行吧
[解决办法]
好象不得行吧
关注
[解决办法]
using System;
using System.Collections.Generic;
using System.Text;

namespace Cons
{
public delegate void tesk();

class Program
{
static void Main(string[] args)
{
Console.WriteLine( "test integer args: ");
Lecture <int> lectrue1 = new Lecture <int> (3);
lectrue1.dowork();
Console.WriteLine( "test null args: ");
Lecture <int> lectrue2 = new Lecture <int> ();
lectrue2.dowork();
}
}

class Lecture <T>
{
tesk choice;
public Lecture()
{
/*其他工作*/
choice = new tesk(delete);
}

public Lecture(T msg)
{
/*其他工作*/
choice = new tesk(update);
}

private void delete()
{
Console.WriteLine( "delete method !~ \n ");
}

private void update()
{
Console.WriteLine( "update method !~ \n ");
}

public bool dowork()
{
if (choice != null)
{
choice.Invoke();
return true;
}
return false;
}
}
}

========================================================================

这个满足你的要求了吗,不过 两个方法是隐式实现的

冒试还有其他方法的,,,,想想先~
[解决办法]
用一个标志构造参数。

如果赋值了,在方法中判断那个标志是否赋值,然后能否调用。
[解决办法]
TO : greenery(greenery)

接口与抽像类其时两个都是可以互用的,只是看个人的习惯.
我那个本来应该是要从接口再分出两个子接口的,即是IGoodsOne,IGoodsTwo.后面的这两个类再从这接口实例出来.GoodsTest则是只和接口(IGoods,IGoodsOne,IGoodsTwo)打交道,而不再去处理具体的类.接口是公开给所有用户的.实例类是个人的.所以这就是工厂的目的:将个人的转为公用的..
[解决办法]
如果使用a=new a()实例化的时候,只能使用UpDate()方法(最好是在a点的时候智能提示不显示Delete()这个方法).

如果使用a=new a(1)实例化的时候,只能使用Delete()方法(最好是在a点的时候智能提示不显示UpDate()这个方法).
----------------------------------
不大可能吧,你的代码还只是设计时的状态,编译器根本没有或可能也没有办法检测出你传什么值进构造函数
[解决办法]
星星也能提这种问题……
------解决方案--------------------



[解决办法]
mark

热点排行