PDA

View Full Version : سوال: مشکل در ارث بری



علیرضا حسن زاده
پنج شنبه 05 فروردین 1389, 18:02 عصر
سلام دوستان
چرا من نمی تونم از کلاس TextBoxBase ارث بری کنم.خطا میده که این اون کلاس سازنده نداره!؟
پس چطوری کلاس TextBox و RichTextBox از اون ارث بری کردن؟
من می خوام یه کنترل RichText سفارشی واسه خودم بسازم که از تراز بندی کامل راست به چپ هم پشتیبانی کنه با یه سری امکانات دیگه

s.Jabbari
پنج شنبه 05 فروردین 1389, 18:07 عصر
میشه کدی رو که نوشتی بذاری!

علیرضا حسن زاده
پنج شنبه 05 فروردین 1389, 18:17 عصر
اینم کد:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication13
{
public class MyTextBox : TextBoxBase
{

public MyTextBox()
{

}
}
}

s.Jabbari
پنج شنبه 05 فروردین 1389, 19:29 عصر
تو new project بجای winapp باید Class رو انتخاب کنی

alireza_s_84
پنج شنبه 05 فروردین 1389, 19:30 عصر
سلام دوستان
چرا من نمی تونم از کلاس TextBoxBase ارث بری کنم.خطا میده که این اون کلاس سازنده نداره!؟
پس چطوری کلاس TextBox و RichTextBox از اون ارث بری کردن؟
من می خوام یه کنترل RichText سفارشی واسه خودم بسازم که از تراز بندی کامل راست به چپ هم پشتیبانی کنه با یه سری امکانات دیگه
سلام دوست عزیز:
کلاس TextBoxBase سازنده internal داره و شما نمیتونید اونو خارج از samably بهش دسترسی داشته باشید بنابر این شما باید کل کلاس TextBoxBaseرو خودت بنویسی و بعد ازش ارث ببری این کلاس از کلاس control مشتق میشه
موفق باشید

exlord
پنج شنبه 05 فروردین 1389, 20:27 عصر
خوب اگه می خوای richtextbox بنویسی از خوده اون inherit بکن دیگه..........

mehdi.mousavi
جمعه 06 فروردین 1389, 01:41 صبح
سلام دوستان چرا من نمی تونم از کلاس TextBoxBase ارث بری کنم.خطا میده که این اون کلاس سازنده نداره!؟ پس چطوری کلاس TextBox و RichTextBox از اون ارث بری کردن؟ من می خوام یه کنترل RichText سفارشی واسه خودم بسازم که از تراز بندی کامل راست به چپ هم پشتیبانی کنه با یه سری امکانات دیگه

سلام.
اگر قبل از ارسال این پست به MSDN مراجعه می کردید، این دو جمله رو اونجا می دیدید:


Notes to Inheritors:
You do not typically inherit from TextBoxBase. To create your own text control class, inherit from TextBox or RichTextBox.


پاورقی: لطفا قبل از اینکه سوالی رو مطرح کنید، ابتدا به MSDN یه نیم نگاهی بندازید.

علیرضا حسن زاده
دوشنبه 09 فروردین 1389, 00:26 صبح
دوستان عزیز من می خوام بدونم که کلاس هایی مثل Textbox چطوری از این کلاس ارث بری کردن با این که سازنده اون هم اینترنال هست MSDN رو هم می دونم و خوندم ولی می خوام روش کار رو یاد بگیرم! اگه زحمتی نیست

mehdi.mousavi
دوشنبه 09 فروردین 1389, 00:38 صبح
دوستان عزیز من می خوام بدونم که کلاس هایی مثل Textbox چطوری از این کلاس ارث بری کردن با این که سازنده اون هم اینترنال هست MSDN رو هم می دونم و خوندم ولی می خوام روش کار رو یاد بگیرم! اگه زحمتی نیست

سلام.
البته که زحمتی نیست :) البته پاسخ به این سوال رو هم در دو 3 تاپیک قبل بهتون دادن، اما با اینحال، در کلاس TextBoxBase، سازنده کلاس internal مارک شده تا Assembly های بیرونی اجازه دسترسی به این ctor رو نداشته باشن.

از اونجاییکه TextBoxBase در فایل System.Windows.Forms.dll تعریف شده و TextBox و RichTextBox هر دو نیز در همین فایل تعریف شده اند، در نتیجه TextBox و RichTextBox به سازنده TextBoxBase دسترسی دارن، اما چون شما در اسمبلی دیگه ای میخواهید از ctor مربوطه استفاده کنید، این دسترسی رو ندارید.

موفق باشید.

alireza_s_84
دوشنبه 09 فروردین 1389, 00:41 صبح
دوستان عزیز من می خوام بدونم که کلاس هایی مثل Textbox چطوری از این کلاس ارث بری کردن با این که سازنده اون هم اینترنال هست MSDN رو هم می دونم و خوندم ولی می خوام روش کار رو یاد بگیرم! اگه زحمتی نیست
دوست عزیز Textbox و RichTextbox هردو با این کلاس در یک کامپوننت (فضای نام واحد) قرار دارن به همین خاطر مشکل دسترسی ندارن ولی شما داری از یک کامپوننت مجزا به این کلاس دست پیدا میکنی لذا طبیعیه و این خصوصیت کلاس که کپسوله کردن اطلاعات هست گفتم شما برای ساختن کنترل مورد نظرت اگر واقعا به این کلاس نیاز داری دوباره پیاده سازیش کن کاری نداره فقط با Reflector سورسش رو توی یک فضای نام متعلق به کامپوننت خودت قرار بده و یک کنترل جدید ازش مشتق کن همون کاری که تمامی کامپوننتهای سفارشی انجام میدن(مثل tolerik) .
موفق باشید

FastCode
دوشنبه 09 فروردین 1389, 01:10 صبح
دوست عزیز Textbox و RichTextbox هردو با این کلاس در یک کامپوننت (فضای نام واحد) قرار دارن به همین خاطر مشکل دسترسی ندارن ولی شما داری از یک کامپوننت مجزا به این کلاس دست پیدا میکنی لذا طبیعیه و این خصوصیت کلاس که کپسوله کردن اطلاعات هست گفتم شما برای ساختن کنترل مورد نظرت اگر واقعا به این کلاس نیاز داری دوباره پیاده سازیش کن کاری نداره فقط با Reflector سورسش رو توی یک فضای نام متعلق به کامپوننت خودت قرار بده و یک کنترل جدید ازش مشتق کن همون کاری که تمامی کامپوننتهای سفارشی انجام میدن(مثل tolerik) .
موفق باشید

درسته ولی مشکلاتی به همراه داره.
مثلا خیلی از کد ها برای شناسایی تکستباکس چک میکنن که type اون Textboxbase هست یا نه.

علیرضا حسن زاده
سه شنبه 10 فروردین 1389, 02:23 صبح
درسته ولی مشکلاتی به همراه داره.
مثلا خیلی از کد ها برای شناسایی تکستباکس چک میکنن که type اون Textboxbase هست یا نه.
میشه یه مثال بزنید؟ تکست باکس که کلاس مخصوص خودش رو داره ومیشه چکش کرد دیگه TextBoxBaseچرا؟ با دیگر کلاس ها قاطی نمیشه مثلا Richtext یا ماسک؟